整數的二進位制 位運算 邏輯與或

2022-08-13 02:36:12 字數 2928 閱讀 6468

正整數的二進位制表示 (假定型別是byte)

正整數的二進位制表示與此類似, 只是在十進位制中,每個位置可以有10個數字,從0到9,但在二進位制中,每個位置只能是0或1。

例如: 0000 1010     ==>   10  

十進位制的負數表示就是在前面加乙個負數符號 -,例如-123。但二進位制如何表示負數呢?

其實概念是類似的,二進位制使用最高位表示符號位,用1表示負數,用0表示正數。

但負數表示不是簡單的將最高位變為1,比如說:

和我們的直覺正好相反,這是什麼表示法?這種表示法稱為補碼表示法,而符合我們直覺的表示稱為原碼表示法,補碼表示就是在原碼表示的基礎上取反然後加1。取反就是將0變為1,1變為0。

負數的二進位制表示就是對應的正數的補碼表示,比如說:

給定乙個負數二進位制表示,要想知道它的十進位制值,可以採用相同的補碼運算。比如:10010010,首先取反,變為01101101,然後加1,結果為01101110,它的十進位制值為110,所以原值就是-110。

byte型別,正數最大表示是01111111,即127,負數最大表示是10000000,即-128,表示範圍就是 -128到127。其他型別的整數也類似,負數能多表示乙個數。

負整數為什麼採用補碼呢?

負整數為什麼要採用這種奇怪的表示形式呢?原因是:只有這種形式,計算機才能實現正確的加減法。

計算機其實只能做加法,1-1其實是1+(-1)。如果用原碼表示,計算結果是不對的。比如說:

1   -> 00000001

-1 -> 10000001

+ ------------------

-2 -> 10000010

用符合直覺的原碼表示,1-1的結果是-2。

如果是補碼表示:

1   -> 00000001

-1 -> 11111111

+ ------------------

0  ->  00000000

結果是正確的。

再比如,5-3:

5   -> 00000101

-3 -> 11111101

+ ------------------

2  ->  00000010

結果也是正確的。

就是這樣的,看上去可能比較奇怪和難以理解,但這種表示其實是非常嚴謹和正確的。

理解了二進位制加減法,我們就能理解為什麼正數的運算結果可能出現負數了。當計算結果超出表示範圍的時候,最高位往往是1,然後就會被看做負數。比如說,127+1:

127   -> 01111111

1       -> 00000001

+ ------------------

-128  ->10000000

計算結果超出了byte的表示範圍,會被看做-128。

以 +1 和 -1 作加法運算為例,如下圖所示:

相信你已經發現,1 + (-1) 這樣的加法運算只要將二進位制數相加,然後-1的末位就會變成2,根據逢2進1機制,從右至左依次所有位都會變成0。

最後,最左端的符號位也會進製1變成0,丟棄溢位的1,就得到最後的結果0的二進位制表示32個0。

對照本節開頭的圖,會發現所有的減法都可以轉換成二進位制位的加法運算:1-2 可以轉換成1+(-2),(-1)-(-2)可以轉換成-1+2……

這跟數學中的表示是一樣的,而且非常地方便計算(很多計算機科學家都是從數學領域轉入計算機工程,所以在很多細微之處的都能見到數學的影子)。因此,現代計算機硬體結構實際上只設計了加法器,大部分的減法其實都是轉換成加法後再運算。

備註:

以正數的二進位制數表示為基準,負數的表示只改變符號位,這樣的表示方式就是原碼。因此,正數的表示方式都是原碼。

反碼就是將原碼除符號位以外的值全部取反,原來是1的變為0,原來是0的變為1。

補碼就是在反碼的基礎上,在二進位制數的右端末位加1(逢2進1)。

正數的原碼和反碼和補碼都一致;負數的原碼是正數的符號位取反;負數的反碼是原碼的非符號位取反;負數的補碼是反碼加1。兩種邏輯與(&&和&)的運算規則基本相同,兩種邏輯或(|| 和 |)的運算規則也基本相同。 &和|運算是把邏輯表示式全部計算完,而&&和||運算具有短路計算功能。

所謂短路計算,是指系統從左至右進行邏輯表示式的計算,一旦出現計算結果已經確定的情況,則計算過程即被終止。 對於&&運算來說,只要運算子左端的值為false,則因無論運算子右端的值為true或為false,其最終結果都為false。 所以,系統一旦判斷出&&運算子左端的值為false,則系統將終止其後的計算過程; 對於 || 運算來說,只要運算子左端的值為true,則因無論運算子右端的值為true或為false,其最終結果都為true。 所以,系統一旦判斷出|| 運算子左端的值為true,則系統將終止其後的計算過程。

⑴ 乘法除法:n * 2 等價於 n << 1; n * 5 等價於 n << 2 + 1; n / 2 等價於 n >> 1。

備註:jvm執行時會自動轉化,大部分其它高階語言的編譯器會做類似優化轉換,所以除非有特殊的理由,否則別這麼寫。

⑵ 取低位:n & 0x0000ffff;取高位:n & 0xffff0000。

⑶ 奇偶判斷:n & 1,等於0為偶,等於1為奇。

⑷ 正負判斷:(n >>> 31) & 1,等於0為正,等於1為負。

⑸ 取餘:n % m ,如m為2的冪次方,可用(n & (m - 1))替代。

參考:老馬說程式設計

二進位制128位整數運算

gcc提供了兩種128位整數型別,分別是 int128 t和 uint128 t,分別用於宣告有符號整數變數和無符號整數變數。有關gcc的文件參見 using the gnu compiler collection gcc 這裡給出了樣例程式,是有關型別 int128 t和 uint128 t的。從...

二進位制與位運算

目錄常見的位運算應用 計算機中,為了方便計算,整數一般在計算機中都以補碼的形式儲存 補碼與原碼的轉換 為了演示方便,以下位運算均以8位的byte進行操作,且計算機中位運算都是以補碼的形式參與位運算 按位與同為1則位1,否則為0 按位或全0為0,否則為1 按位非直接取反,遇1則0,遇0則1 按位異或相...

二進位制位運算(與 或 異或 取反)

1.與運算 and 0 and 0 0 全1才1 1 and 0 0 0 and 1 0 1 and 1 1 用途 用來位置0,若想把ffh 11111111b,255d 第 三 五 從右往左 位置0,只需 and 11101011b 235d,e8h 2.或運算 or 0 or 0 0 全0才0 ...