按位非运算符

JS中的按位非运算符是~,做用是将每位二进制取反内存

十进制2的二进制表示为:基础

 0000,0010二进制

每位都取反:方法

 1111,1101运算符

这是内存中的保存形式。

咱们读取的十进制是根据原码来读取,而在内存中,数值都是以二进制补码形式保存的。

正数的补码和原码同样,负数的原码转补码或者补码转原码的规则:

符号位不变,将剩余位取反,获得反码,在反码的基础上最后一位加一获得负数的补码。

1111,1101输出10进制的过程:

 1.符号位不变,剩余位取反

  1000,0010

 2.最后一位加1

  1000,0011

 3.得的结果1000,0011就是-3的原码形式

~(1) = -2

~(2) = -3

~(3) = -4

~(2018) = -2019

假设A为正数,~(A)结果为B。B是A的每位去反的结果,包括符号位0也取反变成了1。那么B就被当作负数保存在内存中。显示十进制数时,B除符号位外都取反,获得C,C和A的区别在于符号位不一样,其余位都同样,而后C的最后一位加1获得最终结果D。D和A相比,除符号位不一样外,还大一。

假设A为负数,~(A)结果为B。B是A的每位取反的结果,符号位从1变成0。那么B被当作正数保存在内存中。A做为负数,在内存中保存的是补码,假设A的原码是C,补码就是C除符号位,每位取反加一。B就是A的补码包括符号位每位取反,不看符号位的变化的话,也就是C取反加一的基础上再次取反,结果就是B比C少1。

~(0) = -1

~(-1) = 0

~(-2) = 1

~(-3) = 2

~(-4) = 3

 

~~3 = 3

~~ 5 = 5

 

记忆方法是~(A) = -(A+1)

 

负数原码补码转换规则:

  符号位不动,从低位往高位数,遇到第一个1以前,包括第一个1不做任何取反,以后,每位都取反。这样就避免了原码转反码再转补码的繁琐。

相关文章
相关标签/搜索