按位与(&)
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,低位舍弃

01-12 09:01