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也的确会分开,因此达到目的。
各位都是工科生,仔细想想按位异或的最后一步就明白了。