JavaRush /Java Blog /Random-TW /按位取反-為什麼會這樣?
Alex Bolgov
等級 37
Ташкент

按位取反-為什麼會這樣?

在 Random-TW 群組發布
大家好:) 在閱讀《按位運算》一文時我和其他一些人一樣有一個問題:為什麼當我們將數字 342 反轉時,我們會得到 -343。文章中是這樣的: 按位求反 - 為什麼如此 - 1那些特別好奇的人(比如我)有一個疑問:“嘿,但是010101001小於101010110,按邏輯它應該小於342並且是正數。” 將其輸入任何線上數位轉換器或使用以下程式碼進行檢查:
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
出乎意料的是我們得到了-343以外的東西......
169
噢,多麼好啊,有一次,在 C 語言程式設計課上,我不知何故簡單地聽到了一些關於整數中的符號數字的事情。經過谷歌搜尋一段時間後,我現在可以解釋這是什麼動物了。按位求反 - 為什麼如此 - 2事實上,文章中有一個不準確的地方,令人困惑。如果我們檢查程式碼,將數字 342 反轉後的實際結果是什麼:
int a = 342;
System.out.println(Integer.toBinaryString(~a));
那我們會看到稍微不同的結果
11111111111111111111111010101001
為什麼會這樣呢?問題是變數不能簡單地包含 101010110;事實上,它被儲存為
000000000000000000000000101010110
畢竟,一個 int 變數佔用 4 個字節,即 32 位元 - 32 個儲存單元。反轉後,絕對所有數字都會改變,即 並「修剪」前導零。有趣的來了。由於在二進位表示中無法儲存數字前面的 + 或 - 符號,因此有一個技巧:第 1 位實際上負責符號並且恰好是符號。所有數字都按照以下邏輯儲存:從 00...000 到 01...111 的數字都是正數,從 0 開始(即從 0 到 2147483647),從 10...000 到 11...111是負數,從最小的開始到-1結束(即-2147483648到-1)。
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
然後你問,“好吧,納瓦尼,我們會相信你的,但是你為什麼決定這是他的宮殿”,但是這一切怎麼會變成 -343 呢?這真的很簡單。我們可以簡單地手動計算。如果我們「截斷」(或以 0 取代)結果數字 342 的二進位版本的第一位 ( 111111111111111111111111111111111111111010101001 )並將其傳回十進位形式。
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
然後我們就得到了
01111111111111111111111010101001 = 2147483305
事實上,這裡我們並不是一開始就「截掉」了1,而是從這個數字中減去了1000000000000000000000000000000000。現在我們把它加回來,但是是十進制的形式。我們將看到什麼:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
這是所需的數字 -343 :) 夥計們,這是我在這裡的第一篇文章,如果您喜歡它並且內容豐富,請喜歡它(我真的很想收集所有成就😄)您可以這裡閱讀有關此主題的更多資訊: 祝大家好運,感謝您的關注)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION