0%

【位运算】入门篇

最近在工作中很邪门,两次遇到了跟位运算相关的内容。所以想把这块整理成文章。
在写这篇文章的时候,默认已经掌握了二进制转换,原码、反码、补码等等这类基础知识。这部分内容也会出现在。组成原理系列文章中(已经很久没有更新的系列,哎)。

根据IEEE754标准,JavaScript在存储数字时是始终以双精度浮点数来存储的。也就是64位二进制数,64bit,而1Byte = 8bit,相当于8Byte。 其中0到51位存储数字,52到62存储指数,63存储符号。
而在JS位运算中,并不用64位来计算,它会把值转为32位数值再进行位运算。位运算结束后,再将32位转为64位储存。所以我们在位运算时只需要关注32位整数就可以

按位与&

两位同为1则为1,否则为0
例:

1
2
3
4
  0011    
& 0101
------
0001

按位或|

只要其中一位是1,结果就为1
例:

1
2
3
4
  0011
| 0101
------
0111

按位异或^

相同的位为0,不同的位为1。我们可以理解为就是做无进位加法:

1
2
3
4
  0011
^ 0101
------
0110

异或有几条性质:

  1. 交换律 a^b = b^a
  2. 结合律(a^b)^c = a^(c^b)
  3. 对于任何数,都有x^x=0, x^0=x
  4. 自反性:a^b^b=a^0=a;

按位取反~

0变1,1变0

1
~0011 = 1100

按位左移 <<

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

按位右移

有符号右移>>

将数值的二进制码按照指定的位数向右移动,符号位不变,高位补符号位.

无符号右移>>>

将数值的所有 32 位字符都右移,然后将高位补0。