这是一个leetcode问题.给定一组数字nums,其中恰好两个元素只出现一次而所有其他元素恰好出现两次.找到只出现一次的两个元素.
例如:给定nums = [1,2,1,3,2,5],返回[3,5].我的代码是:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int axorb=0;
for(auto i:nums) axorb=axorb^i;
int differbit=(axorb&(axorb-1))^axorb;
int group3=0, group5=0;
for(auto i:nums)
Run Code Online (Sandbox Code Playgroud)
if(differbit&i!=0) group5=group5^i;
else group3=group3^i;
return vector<int>{group3,group5};
}
};
Run Code Online (Sandbox Code Playgroud)
提交结果是错误的答案.
Input:[0,0,1,2]
Output:[3,0]
Expected:[1,2]
Run Code Online (Sandbox Code Playgroud)
但如果我只是将突出显示的部分更改为
if(differbit&i) group5=group5^i;
Run Code Online (Sandbox Code Playgroud)
它被接受了.我花了很多时间思考但仍然不知道.也许某种类型转换发生了?谢谢
这与运算符优先级有关.
因为在早期的C中,&& and ||运营商被添加到很晚,它被赋予了非常低的优先级,因此它不会破坏遗留程序.
这个堆栈溢出问题有一个很好的答案,为什么:
来自这个论坛:http://bytes.com/topic/c/answers/167377-operator-precedence
&&和|| 后来因为"短路"行为而加入了运营商.Dennis Ritchie回想起,在添加逻辑运算符时,应该更改位运算符的优先级.但是由于当时存在几百千字节的C源代码,并且安装了三台计算机,Dennis认为C语言的改变太大了......
正如您所看到bitwise &的那样低于!=表格,因此您的代码正在执行以下操作:
if ( differbit & (i!=0) )
Run Code Online (Sandbox Code Playgroud)
而不是我认为你打算做的事情:
if ( (differbit & i) != 0 )
Run Code Online (Sandbox Code Playgroud)