按位与(&)
0101&1001 = 0001 //有一个为0则结果为0
按位或(|)
0101|1001 = 1101 //有一个为1则结果为1
按位取反(~)
~0101 = 1010 //0变1,1变0
按位异或(^)
0101^1001 = 1100 //对应bit位相同,则结果位取0,否则取1
- 0异或任何数=任何数
- 1异或任何数=任何数取反
- 任何数异或自己=把自己置为0
按位异或常见用途:
1.使某些特定的位翻转 (reverse)
2.实现两个值的交换,而不必使用临时变量
a=9(1001), b=12(1100)
a = a^b //0101
b = b^a //1001
a = a^b //1100
3.快速判断两个值是否相等 return (a^b)== 0
原码:一个数绝对值的2进制码就是该数的原码
反码:对一个数的原码取反,得到的就是该数的反码
补码:对一个数的反码+1,得到的就是该数的补码(最小值除外)
移位运算
<< 左移位
计算规则:将2进制数据整体向左移动一位,高位自动溢出,低位补0
n = 00000100 10010001 00111111 01010101
m=n<<1 0000100 10010001 00111111 010101010
k=n<<2 000100 10010001 00111111 0101010100
j=n<<8 10010001 00111111 01010101 00000000
>> 带符号右移
计算规则:规则: 当高位(符号位)为1的时候,高位补1,保持负数符号,低位舍弃 当高位(符号位)为0的时候,高位补0,低位舍弃
n = -50 11111111 11111111 11111111 11001110 -50
m=n>>1 111111111 11111111 11111111 1100111 -25
k=n>>2 1111111111 11111111 11111111 110011 -13
n = 50 00000000 00000000 00000000 00110010 50
m=n>>1 000000000 00000000 00000000 0011001 25
k=n>>2 0000000000 00000000 00000000 001100 12
>>> 无符号右移
计算规则:无论是正数还是负数,高位补0,低位舍弃