Skip to main content

二进制与位运算的实用操作

由上图,可得出一些规律

  • ~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

用法:

  1. 判断奇偶 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

用法:

  1. 整数交换变量
let a = 27
let b = 99
a = a ^ b
b = a ^ b
a = a ^ b
  1. 整数数字加解密
const key = 123
const encode = t => t ^ key
const decode = code => code ^ key

~ (not)

9 = 0000 1001
~ ---------
-10=1111 0110

用法:

  1. 倒过来取下标,比如

​ 最后一个 arr.slice(~0)

​ 倒数第二个 arr.slicce(~1)

左移 << (shl)

保留符号位(第32位不动)的左移,右边多的用 0 补充

2 = 0000 0010
<< ---------
1
4 = 0000 0100

用法:

  1. 乘以 2 的 n 次方 1 << 3 === 1 * 2 * 2 * 2

    4 << 3 === 4 * 2 * 2 * 2

右移 >> (shr)

保留符号位(第32位不动)的右移,左边多的用 0 补充

2 = 0000 0010
>> ---------
1
1 = 0000 0001

用法:

  1. 除以 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...