今天在看JavaScript高级程序那本书,突然发现page40里面的一个运算搞不清了,所以特此来回忆一下。
首先,在理解位运算符之前先要搞清楚计算机在内存的计算和存储方式,这里简单说一下,具体参考我的另一篇文章:原码、反码、补码
我们要明白在计算机的世界里底层的运算都是二进制的形式。对于数学上的算术运算,我们人类一下子就能辨认出这是正数还是负数,然后进行相应运算,但是计算机只认识0和1,所以为了能够让它在计算的时候也知道正负,就用二进制的最高位来标识正负,0代表正,1代表负。
后来人们又发现通过补码的形式在计算机中的算术运算和人类的数学运算是一致的,所以后来就有了补码的概念,计算机中的有符号数都是以二进制的补码形式存储的。
对于正数:原码 = 反码 = 补码。
对于负数:
- 反码为原码的最高位不变,其余位取反。
- 补码为在反码的基础上加1。
对于~运算符,其实就是按位取反的意思,操作的是二进制数。
例如:2进行~2操作后的步骤为:
- 2的二进制为: 00000010
- ~2 按位取反后为:11111101
- 由于计算机中所有有符号数都是以补码的形式存在,所有进行转换。
- 11111101的反码为10000010
- 10000010的补码为10000011
- 1000011对应十进制为-3
总上,~2 === -3
总结:按位非操作的本质:操作数的负值减1.