参考:
javascript操作符(~、&、|、^、>>、<<) 计算机里的数字表示形式
右移 : >>
a >> n
有符号右移:将 a 的二进制表示向右移 n (< 32) 位,丢弃被移出的位。
即整体向右移b位,例如 1010, 右移一位 变为 101,0 并丢弃被移除的 0 。变为 101
无符号右移: >>>
该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。(译注:即便右移 0 个比特,结果也是非负的。)
按位非运算符(~): 反转操作数的位。包括最高位(符号位)
const a = 5; // 0000000000000101
console.log(~a); // 1111111111111010
// expected output: -6
const b = -3; // 1111111111111101
console.log(~b); // 0000000000000010
// expected output: 2
~(6.5) // -7
~~(6.5) // 6
~ 返回 2 的补码,
并且 ~ 会将数字转换为 32 位整数,因此我们可以使用 ~ 来进行取整操作。
~x 大致等同于 -(x+1)。
对补码按位进行与操作
const a = 5; // 00000000000000000000000000000101
const b = 3; // 00000000000000000000000000000011
console.log(a & b); // 00000000000000000000000000000001
// expected output: 1
是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
优点是易于分辨,缺点是不能够直接参与运算。
如:
127的原码为0111 1111
-127的原码为1111 1111
正数的反码与原码一致;
负数的反码是对原码按位取反,只是最高位(符号位)不变。
127的反码为0111 1111
-127的反码为1000 0000
正数的补码与原码一致;
负数的补码是该数的反码加1。
127的补码为0111 1111
-127的补码为1000 0001
计算机中使用补码来表示负数,这样可以将加法运算扩展到所有的数值计算上,因此在数字电路中我们只需要考虑加法器的设计就行了,而不用再为减法设置新的数字电路