位运算
-
左移 n位,×2^n
- 操作数<<位数
- 左边的操作数转为二进制,左边最高位丢弃,右边补0
-
右移 n位,/2^n
- 操作数>>位数
- 右移指定位数,最高位是0,左边补0,最高位1,左边补1
-
无符号右移
- 操作数>>>位数
- 右移指定位数,最高位无论0还是1,统一补0
-
负数右移,让补码右移,再转成源码
位运算奇偶判断
- 让这个数和1相与
- 6 & 1 = 0 偶数
- 7 & 1 = 1 奇数
位运算两数交换
- 一个数对自己异或一次,在和另一个数异或
- a = 2 b = 5
- a = a ^ b
- b = b ^ a
- a = a ^ b
位运算两数相加
-
不考虑进位 可用位运算逻辑^异或代替
1 + 1 = 0 1 + 0 = 1 0 + 1 = 1 0 + 0 = 0 1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0
-
考虑进位 可用位运算按位与&代替
1 + 1 = 1 //进位 1 + 0 = 0 0 + 1 = 0 0 + 0 = 0 1 & 1 = 1//进位 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0
-
例:11 + 01 = 100
11 ^ 01 = 10 //算出本位和 (11 & 01) << 1 = 10 //算出进位 //重复上次计算直至进位为0 10 ^ 10 = 00 (10 & 10) << 1 = 100 00 ^ 100 = 100 (00 & 100) << 1 = 0//不再进位,得到100
-
代码实现
int sum(int a, int b) {
int sum = a ^ b;
int carry = a & b;
while(carry) {
int t_s = s;
int t_c = carry << 1;
s = t_s ^ t_c;
carry = t_s & t_c;
}
return sum;
}