位操作AND

时间:2016-04-22 03:49:10

标签: c++ bit

这是一个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)
  

if(differbit&i!=0) group5=group5^i;

        else group3=group3^i;
        return vector<int>{group3,group5};

}
};

提交结果是错误的答案。

Input:[0,0,1,2]
Output:[3,0]
Expected:[1,2]

但如果我只是将突出显示的部分更改为

if(differbit&i) group5=group5^i;

它被接受了。 我花了很多时间思考但仍然不知道。也许某种类型转换发生了?感谢

1 个答案:

答案 0 :(得分:6)

这与运营商优先权有关 因为在早期的C中,&& and ||运算符被添加到了较晚的优先级,所以它不会破坏遗留程序。

这个Stack overflow Question对于原因有很好的答案:

  

来自此论坛:http://bytes.com/topic/c/answers/167377-operator-precedence

     

&amp;&amp;和||后来因为“短路”行为而加入了运营商。 Dennis Ritchie回想起,在添加逻辑运算符时,应该更改位运算符的优先级。但是当时存在几百千字节的C源代码并且安装了三台计算机,Dennis认为C语言的改变太大了......

这是显示运营商优先级的A Tableenter image description here
显示!=的优先级高于&

正如您所看到的,bitwise &低于!=,因此您的代码正在执行以下操作:

if ( differbit & (i!=0) )

而不是我认为你打算做的事情:

if ( (differbit & i) != 0 )