1. & 和 | 的基本操作
137. 只出现一次的数字 II - 力扣(LeetCode)
先对位运算的操作进行复习:
1、>> 右移操作符
2. << 左移操作符
注意,所有的操作符只能移动整数。
3. & 和 |
& //按位与
| //按位或&:两位数都为1时为1,其余时候为0
| : 两位数只要有一个为1,就为1,其余时候为0
并且,| ^ &的优先级都是低于==和!=的, 需要判断语句时记得加括号
 
  
 
意义:
有了以上铺垫,我们再学习思路:
答案:
int singleNumber(vector<int>& nums) {
        int ans = 0;
        for (int i = 0; i < 32; ++i) {
            int x = 0;
            for (int j = 0; j < nums.size(); ++j) {
                x += (nums[j] >> i) & 1;
            }
            if (x % 3) {
                ans |= (1 << i);
            }
        }
        return ans;
    }2.小试牛刀
136. 只出现一次的数字 - 力扣(LeetCode)
依然是找出只出现一次的数据,不过按位异或就可以了
 int singleNumber(vector<int>& nums) {
        int ans=0;
        for(auto e:nums){
            ans^=e;
        }
        return ans;
    }3.位运算 x & -x 来获取x的lowbit(取出二进制下X最低位的1)
我们可以认为x &-x是一种取得最低位1的技巧,并且这个用法对负数也凑效。
来个大的:
260. 只出现一次的数字 III - 力扣(LeetCode)
                    
分开的方法:

我们处理如下:

会在x处出现-2^31次方的,答案一定是0和-2^31,否则x不会等于-2^31
并且在下文中,0和-2^31也的确会分开,因此达到目的。
各位都是工科生,仔细想想按位异或的最后一步就明白了。










