为了账号安全,请及时绑定邮箱和手机立即绑定

在javascript中为什么~8=-9,~-8=7?

在javascript中为什么~8=-9,~-8=7?

largeQ 2018-11-13 13:15:04
研究javascript中位运算相关资料,对取反位运算很是不理解,不明白取反后为什么不是最大数-目前的值,而是~8=-9,~-8=7?
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

因为 ~8 恰好是 -9 在计算机中的表示方式。。。。
32位无符号整数可以表示 0 ~ 2^32-1的正整数范围,这样可以表示2^32个整数。
当作为有符号数的时候,不是把最高的比特位作为符号位,即 -1 不是直接把000..001 的最高bit置为 1 ,而是使用其 -1 + 2^32 = 2^32-1 对应的二进制数表示。这种形式叫做补码。一种最快的求负数补码的方式是,其绝对值的二进制,从低位开始,遇到的第一个 1 之前(包括这个1)不变,其他的 1 变 0, 0 变 1。 比如 -4 的补码是, 4 -> 00...0100 -> 11...1100

这样做的好处是,减少运算规则,对于加法和减法,计算机不必区分是不是有符号的。比如 4 位的整形。 有符号的-5 + 4 = -1 二进制表示是 1011 + 0100 = 1111,而无符号的11+4=15二进制形式也是1011 + 0100 = 1111 。如果用1101 表示-5那么有符号加法就是1101 + 0100 = 1111,这样,人看起来不方便,计算机也不方便。

你说的对,去反就是最大的值-当前的值 这是对于无符号整数来说的。 只是除了>>> 之外,JS 位操作符的返回值,是有符号型的32位整数。

function toUint32(x) {return x>>>0;}

function toInt32(x) { return x>>0;}


MaxUint32 = toUint32(-1);// -1 的二进制表示和 2^32 - 1 一样(32位整形来说)


console.log(MaxUint32) // 4294967295


console.log(8 + toUint32(~8) === MaxUint32)  // true

console.log(7 + toUint32(~7) === MaxUint32)  // true


//  下面几个与本问题无关,就当是扩展了,自己试试输出是什么。

console.log(MaxUint32 + 1)

console.log(toUint32(MaxUint32+1))

console.log(toUint32(MaxUint32+2))


查看完整回答
反对 回复 2018-12-14
  • 1 回答
  • 0 关注
  • 797 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号