按位取反的一些问题

最近,一直在被~这个运算符困惑,所以今天认真搞了一稿其原理性的东西,也让我觉得是应该好好学习计算机的基础知识啊。
了解按位取反之前我们需要了解一下将十进制的负数转化为二进制,在了解这个之前我们又需要了解一下原码、反码、补码。

原码:二进制的定点数,最高位为符号位,0是正数,1是负数,其优点是很直观的反应出来二进制数,假如2的二进制数是0…0010,-2的二进制数是1…0010,但是真如这样这样的运算容易出错,比如0…0010 + 1…0001的话为-3,但是十进制中是2+1,结果为3

反码:是数据存储的一种,其算法就是将其原码的进行按位取反,按位取反的意思是说每一位取其相反,也是就说2的二进制为…0010,按位取反后为…1101,但是符号位不变。

补码:计算机中,数值全部用补码来存储,补码的作用可以将符号位和数值域统一处理,加法与减法统一处理,补码就是在其相反数的所有位数按位取反的基础上进行+1的运算,这就完成补码的运算。

以上的计算步骤就是负数的这些反码,补码的运算方式,然而正数的反码原码补码都是一样的。

理论看完,下面来一些例子:
-2的原码1…0010,反码1…1101,补码是1…1110;
所以16的补码为其原码:为0…0001 0000,-8的补码为:1…1000,
我们再来看~运算符,这个运算符是按位取反运算符,看几个例子来理解下:
~2的运算步骤
2的补码是0…0010,
对其进行按位取反1…1101,
转为原码:
除去符号位进行按位取反1…0010,再进行+1再进行转化为10进制,所以会得到-3
代码验证:

console.log(~2);  // -3

9的补码是0…1001,
对其进行按位取反1…0110,
转为原码:
除去符号位按位取反1…1001,再进行+1在进行转化为10进制,所以会得到-10
代码验证:

console.log(~9);  // -10

-9的补码是1…10111,
对其进行按位取反0…01000,转为10进制,所以会得到8
代码验证:

console.log(~-9);  // 8
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值