位运算(补码、左移、右移、取反、与、或)以及应用
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.位运算的应用
-
不引用第三个编码交换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 -
找出一组整型数据,这一组数据中只有一个数只出现了一次,其他的都出现了两次。
假设一组整型数据为 a b c a c,将这一组数据全部异或得 a ^ b ^ c ^ a ^ c 使用结合律得 b^ (a ^ a) ^ (c ^ c) = b ^ 0 ^0 = b
Ending
有错误欢迎指出,谢谢