Skip to content

Latest commit

 

History

History
104 lines (60 loc) · 2.51 KB

operator.md

File metadata and controls

104 lines (60 loc) · 2.51 KB

运算符

参考:

javascript操作符(~、&、|、^、>>、<<) 计算机里的数字表示形式

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

按位或 |

计算机有符号数有3种表示法:原码、反码和补码

原码(true form)

是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

优点是易于分辨,缺点是不能够直接参与运算。

如:

127的原码为0111 1111

-127的原码为1111 1111

反码

正数的反码与原码一致;

负数的反码是对原码按位取反,只是最高位(符号位)不变。

127的反码为0111 1111

-127的反码为1000 0000

补码

正数的补码与原码一致;

负数的补码是该数的反码加1。

127的补码为0111 1111

-127的补码为1000 0001

计算机中使用补码来表示负数,这样可以将加法运算扩展到所有的数值计算上,因此在数字电路中我们只需要考虑加法器的设计就行了,而不用再为减法设置新的数字电路