位运算
进制转换
十进制转二进制
分为整数部分
和小数部分
整数部分
方法:除2取余,逆序排列
,即每次将整数部分除以 2,余数为该位权上的数,而商继续除以 2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为 0 为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。
INFO
12 -> 1100
12 除 2, ----- 余 0
6 除 2, ----- 余 0
3 除 2, ----- 余 1
1 除 2, ----- 余 1
小数部分
方法:乘2取整,顺序排列
,即将小数部分乘以 2,然后取整数部分,剩下的小数部分继续乘以 2,然后取整数部分,剩下的小数部分又乘以 2,一直取到小数部分
INFO
0.125 -> 0.001
0.125 乘 2 = 0.25 ----- 0
0.25 乘 2 = 0.5 ----- 0
0.5 乘 2 = 1 ----- 1
INFO
12.125 -> 1100.001
二进制转十进制
方法:按权相加法,即将二进制每位上的数乘以权,然后相加之和即是十进制数。
INFO
10101000.001 -> 168.125
1x27 + 0x26 + 1x25 + 0x24 + 1x23 + 0x22 + 0x21 + 0x20 + 0x2-1 + 0x2-2 + 1x2-3
0.1 + 0.2 !== 0.3
INFO
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 补齐