在javascript中为什么~8=-9,~-8=7?
研究javascript中位运算相关资料,对取反位运算很是不理解,不明白取反后为什么不是最大数-目前的值,而是~8=-9,~-8=7?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
研究javascript中位运算相关资料,对取反位运算很是不理解,不明白取反后为什么不是最大数-目前的值,而是~8=-9,~-8=7?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
因为 ~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位整数。取反?按位非吧,执行按位非的结果就是返回数值的反码。
因为这里的按位取反并不是真正的按位取反,而是
补码运算
。具体的请参考这个问题:js中怎么理解按位取反?
取反操作会将符号位也取反,详见:《JavaScript 高级程序设计》3.5.2 位操作运算