Java 代碼品讀1 —— Integer.highesOneBit(i)

1、閱讀代碼時候,偶爾看到 Integer.highestOneBit(i)
這個函數調用。使用的第一感覺就是這個函數是幹什麼用的,通過查看文檔得知,這個函數的作用是取 i 這個數的二進制形式最左邊的最高一位且高位後面全部補零,最後返回int型的結果。

機器數
一個數在計算機中的二進制表示形式, 叫做這個數的機器數。機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數爲0, 負數爲1。

真值
因爲第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 10000011,其最高位1代表負,其真正數值是 -3 而不是形式值131(10000011轉換成十進制等於131)。所以,爲區別起見,將帶符號位的機器數對應的真正數值稱爲機器數的真值。

原碼, 反碼, 補碼基本概念

原碼(true form)是一種計算機中對數字的二進制定點表示方法。原碼錶示法在數值前面增加了一位符號位(即最高位爲符號位):正數該位爲0,負數該位爲1(0有兩種表示:+0和-0),其餘位表示數值的大小。

原碼的優點
簡單直觀;例如,我們用8位二進制表示一個數,+11的原碼爲00001011,-11的原碼就是10001011

原碼的缺點
原碼不能直接參加運算,可能會出錯。例如數學上,1+(-1)=0,而在二進制中00000001+10000001=10000010,換算成十進制爲-2。顯然出錯了。

補碼
在計算機系統中,數值一律用補碼來表示和存儲。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬件電路。

原碼, 反碼, 補碼錶示方法

原碼
原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值.

反碼
正數的反碼是其本身
負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.

補碼
正數的補碼就是其本身
負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補

總結

正數的原碼,反碼,補碼相同。
負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.
負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 末位+1.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章