zhangdizhangdi

位运算

进制转换

十进制转二进制

分为整数部分小数部分

整数部分

方法:除2取余,逆序排列,即每次将整数部分除以 2,余数为该位权上的数,而商继续除以 2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为 0 为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。

12 -> 1100

12 除 2, ----- 余 0
6 除 2, ----- 余 0
3 除 2, ----- 余 1
1 除 2, ----- 余 1

小数部分

方法:乘2取整,顺序排列,即将小数部分乘以 2,然后取整数部分,剩下的小数部分继续乘以 2,然后取整数部分,剩下的小数部分又乘以 2,一直取到小数部分

0.125 -> 0.001

0.125 乘 2 = 0.25 ----- 0
0.25 乘 2 = 0.5 ----- 0
0.5 乘 2 = 1 ----- 1

12.125 -> 1100.001

二进制转十进制

方法:按权相加法,即将二进制每位上的数乘以权,然后相加之和即是十进制数。

10101000.001 -> 168.125

1x27 + 0x26 + 1x25 + 0x24 + 1x23 + 0x22 + 0x21 + 0x20 + 0x2-1 + 0x2-2 + 1x2-3

0.1 + 0.2 !== 0.3

0.1 -> 0.0001100110011001100110011001100110011001100110011001101
0.2 -> 0.001100110011001100110011001100110011001100110011001101

位运算

按位运算(&)

两个位都为 1 时,结果才为 1,否则为 0

1&1 为 1,0&0 为 0,1&0 也为 0

按位运算(|)

有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0

1|1 为 1,0|0 为 0,1|0 为 1

按位异或运算(^)

不同时,结果为 1,相同时结果为 0

0^1 为 1,0^0 为 0,1^1 为 0

取反运算(~)

~1 为 0,~0 为 1

左移运算(<<)

全部左移若干位,高位丢弃,低位补 0

常用场景: 乘以 2 的 n 次方

右移运算(>>)

全部右移若干位,低位丢弃,高位补 0 或 1。如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1。

常用场景: 除以 2 的 n 次方

无符号右行移(>>>)

忽略符号位,空位都以 0 补齐

参考