按位非运算符 详解

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

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

0000,0010

每位都取反:

1111,1101

这是内存中的保存形式。

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

正数的补码和原码一样,负数的原码转补码或者补码转原码的规则:
符号位不变,将剩余位取反,得到反码,在反码的基础上最后一位加一得到负数的补码。

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

  1. 符号位不变,剩余位取反
      1000,0010
  2. 最后一位加1
      1000,0011
  3. 得的结果1000,0011就是-3的原码形式
~(1) = -2   1的原码是0000 0001 ,所以~(1)=1111 1110   而-2的原码是1000 0010,补码是1111 1101,恰好和~(1)相等,毕竟-2在内存里面是以补码的形式存在的,,所以直接和补码比较是否相等即可

~(2) = -3  2的原码是0000 0010 所以~(2)=1111 1101,而-3的原码是1000 0011,补码是1111 1101,恰好和~(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  0的原码是0000 0000 ,那么~(0)就是1111 1111 ,而-1的原码是1000 0001,补码是1111 1111,恰好和~(0)相等,毕竟-1在内存里面是以补码的形式存在的,所以直接和补码比较是否相等即可

~(-1) = 0

~(-2) = 1

~(-3) = 2

~(-4) = 3


~~3 = 3

~~ 5 = 5

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

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

本文的转载自:https://www.cnblogs.com/bibiafa/p/9389213.html

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值