亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在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 關注
  • 860 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號