最近在工作中很邪门,两次遇到了跟位运算相关的内容。所以想把这块整理成文章。
在写这篇文章的时候,默认已经掌握了二进制转换,原码、反码、补码等等这类基础知识。这部分内容也会出现在。组成原理系列文章中(已经很久没有更新的系列,哎)。
根据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
异或有几条性质:
- 交换律
a^b = b^a
- 结合律
(a^b)^c = a^(c^b)
- 对于任何数,都有
x^x=0, x^0=x
- 自反性:
a^b^b=a^0=a;
按位取反~
0变1,1变01
~0011 = 1100
按位左移 <<
各二进位全部左移若干位,高位丢弃,低位补 0
按位右移
有符号右移>>
将数值的二进制码按照指定的位数向右移动,符号位不变,高位补符号位
.
无符号右移>>>
将数值的所有 32 位字符都右移,然后将高位补0。