位操作个人总结
位操作实现加减法
工具
- &操作 、 << 左移位 用于求进位
- ^操作 用于不进位加法
原理
1. 不进位加法运算 。
2. 计算进位 。
3. 把进位加上重复12操作,直到进位为0
举例
6+12
二进制为0110+1100
- (0110^1100)=1010
- (0110&1100)<<1=1000
进位不为0 ,重复1、2 - (1010^1000)=0010
- (1010&1000)<<1=10000
进位不为0 ,重复1、2 - (0010^10000)=10010
- (0010&10000)<<1=0
进位为0
结果就是10010=18
代码演示
//计算a与b之和(也就是加减法运算)
public int getSum(int a, int b) {
while (b!=0){
int tmp=a^b;
b=(a&b)<<1;
a=tmp;
}
return a;
}
位操作的小技巧
数学准备
a&a=0;
0&a=a;
a&b&a=(a&a)&b=0&b=b;
题目背景
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。题目来源
我们可以对所有数据进行&操作,就可以得到单身狗数字了。
代码
public int singleNumber(int[] nums) {
/* Integer[] arr = new Integer[nums.length]; for (int i = 0; i < nums.length; i++) { arr[i] = nums[i]; } Arrays.sort(arr); for (int i = 0; i < arr.length - 1; i = i + 2) { if (!arr[i].equals(arr[i+1])) return arr[i].intValue(); } return arr[arr.length - 1].intValue();*/
int demo=0;
for(int i:nums){
demo=demo^i;
}
return demo;
}