二进制与位运算的实用操作
由上图,可得出一些规律
~x = - x - 1
对应关系 0 和 -1、1 和 -2、2 和 - 3....~x & x = 0
~x | x = -1
~x ^ x = -1
x | 0 = x
x ^ 0 = x
x ^ y ^ y = x
二进制操作
与 &
(and)
两个都为 1 时,结果为 1。
10= 0000 1010
6 = 0000 0110
& ---------
2 = 0000 0010
用法:
- 判断奇偶
x&1 === 1
true 为奇数,false 为偶数,0 也会被认为是偶数,需要处理
或 |
(or)
两个都为 0 时,结果为 0。
10= 0000 1010
6 = 0000 0110
| ---------
14= 0000 1110
用法:
异或 ^
(xor)
两个相同为 0,相异为 1。
8 = 0000 1000
6 = 0000 0110
^ ---------
14= 0000 1110
用法:
- 整数交换变量
let a = 27
let b = 99
a = a ^ b
b = a ^ b
a = a ^ b
- 整数数字加解密
const key = 123
const encode = t => t ^ key
const decode = code => code ^ key
非 ~
(not)
9 = 0000 1001
~ ---------
-10=1111 0110
用法:
- 倒过来取下标,比如
最后一个 arr.slice(~0)
倒数第二个 arr.slicce(~1)
左移 <<
(shl)
保留符号位(第32位不动)的左移,右边多的用 0 补充
2 = 0000 0010
<< ---------
1
4 = 0000 0100
用法:
乘以 2 的 n 次方
1 << 3 === 1 * 2 * 2 * 2
4 << 3 === 4 * 2 * 2 * 2
右移 >>
(shr)
保留符号位(第32位不动)的右移,左边多的用 0 补充
2 = 0000 0010
>> ---------
1
1 = 0000 0001
用法:
- 除以 2 的 n 次方,向下取整
16 >> 3 = 16 / (2 * 2 * 2) = 2
6 >> 1 = 6 / 2 = 3
无符号右移 >>>
将 32 位的所有数右移。正数等同于 >>
2 = 0000 0010
>>> ---------
1
1 = 0000 0001
-2 = 1111 1111 1111 1111 1111 1111 0000 0010
>>> ---------------------------------------
1
= 0111 1111 1111 1111 1111 1111 0000 0001
进制转换
十进制:逢十进一,生活中常用的数值
二进制:逢二进一,计算机系统使用的数制,只有0和1
八进制:逢八进一,采用0,1,2,3,4,5,6,7八个数字,通常用数字
0
开头表示八进制十六进制:逢十六进一,采用0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F十六个数字,A-F表示十进制中的10-15,通常用
0x
开头来表示
十进制转二进制
正数转二进制
除二取余,倒叙排序,高位补0
1 -> 00000001
2 -> 00000010
...
负数转二进制
将该负数的正数进行取反,然后加1
-1的正数1: 0000 0001
取反: 1111 1110
+1: 0000 0001
结果: 1111 1111
整型数据在内存中的存储方式
第0位为符号为,0为正数,1位负数
小数的十进制转二进制
乘2取整,顺序排列
0.1 ---> 0.000110011001100110011...