位运算(取反、补码、左移、右移、与、或)

1.取反

  • 将需要计算的数字换算为二进制(0、1)。每个位上都取相反值,1变成0,0变成1

2.补码

  • 正数的补码就是其二进制表示,与原码相同
  • 负数的补码表示方法:将其对应的正数的原码除符号位外的所有位取反加1
  • 如求-5的补码表示 -5 对应正数5(0000 0101)取反得 (1111 1010)加一得 (1111 1011)故-5的补码表示为 1111 1011

3.左移(<<)

i. 例一:(10<<2)

1) 将参加运算的两个数转换为二进制,若默认为int则有32位,这里默认为short型16位
	10 (0000 0000 0000 1010)
2) 左移两位,右补0(0000 0000 0010 1000)40

ii. 例二:(-10<<2)

1) 先求出-10以补码的形式表示为 10取反+1(1111 1111 1111 0101)+1 = 1111 1111 11110110
2) 将-10以补码的形式表示左移两位1111 1111 1101 1000
3) 将补码算出来的结果转换为原码 取反+1  1000 0000 0010 0111+1 = 1000 0000 0010 1000 转为十进制为-40

iii. 总结

左移一位就是原值乘2的1次方,左移两位的就是原值乘2的2次方

4.右移(>>)

i. 例一:(10>>2)

1) 将参加运算的两个数转换为二进制,若默认为int则有32位 10 (0000 0000 0000 1010)
2) 右移两位,将各二进制位全部向右移动,对于正数相当于在左边补0 (0000 0000 0000 0010) 2

ii. 例二:(-10>>2)

1) 先求出-10以补码的形式表示为 10取反+1(1111 1111 1111 0101)+1 = 1111 1111 1111 0110
2) 将-10以补码的形式表示右移两位1111 1111 1111 1101 左边补1
3) 转换为原码符号位依然为1(负数) 1000 0000 0000 0011    -3 

iii. 总结

右移一位的结果就是原值除2的1次方 结果向下取整

5.与

  • 与数学的与一样 0&1 =0 ,0& 0=0,1&1 =1

6.或

1|0 = 1,1|1=1,0|0=0

7.异或^

相同值为0,不同值为1,异或支持交换律和结合律

8.位运算的应用

  1. 不引用第三个编码交换a,b的值。
    a = a ^ b (1)
    b = a ^ b (2)
    a = a ^ b (3)
    将(1)代入(2)中得
    b = (a ^ b) ^ b = a ^ ( b ^ b) = a ^ 0 = a
    将(2)代入(3)
    同理 a = (a ^ b) ^ a= b ^ 0=b

  2. 找出一组整型数据,这一组数据中只有一个数只出现了一次,其他的都出现了两次。
    假设一组整型数据为 a b c a c,将这一组数据全部异或得 a ^ b ^ c ^ a ^ c 使用结合律得 b^ (a ^ a) ^ (c ^ c) = b ^ 0 ^0 = b

Ending

有错误欢迎指出,谢谢

Guess you like

Origin blog.csdn.net/qiugengjun/article/details/107665152