0%

二进制计算

位运算

力扣Offer65题

求两个数字a,b的和,用二进制形式,a(i)代表a的二进制第i位,分为以下四种情况

无进位和异或运算规律相同,进位与运算规律相同(并需要向左移一位),因此,无进位和n与进位c的计算公式如下:

n = a | b   非进位和:异或运算

c = a & b << 1   进位:与运算 + 左移一位

循环求n和c,直至c = 0;此时s = n,返回n即可


负数在计算机中用补码表示

补码:除了符号位,其余位取反,再加1

补码的优势:加法、减法可以统一处理(CPU只有加法器)


1
2
3
4
5
6
7
8
public int add(int a, int b) {
while(b != 0) { // 当进位为 0 时跳出
int c = (a & b) << 1; // c = 进位
a ^= b; // a = 非进位和
b = c; // b = 进位
}
return a;
}

Java支持的位运算符:

&:按位与

|:按位或

~:按位非

^:按位异或

<<:左位移运算符

:右位移运算符

<<<:无符号右移运算符

除了~以外,其余均为二元运算符。操作数只能为整型和字符型数据。

正数符号位为0,负数为1

运算0为假,1为真

按位或与异或区别

按位或—— 1 | 1 = 1
按位异或—— 1 ^ 1 = 0

向下整除n//2等价于右移一位n>>1
取余数n%2等价于判断二进制最右一位值n&1;