二進位制和位運算

2021-09-12 16:24:50 字數 4552 閱讀 4794

逢2進1的計數規則

電子裝置設計成處理2進製,其成本最優。

所有程式語言都是一種人和計算機之間的翻譯工具,人的陣列語言翻譯成二進位製給計算機讀取,然後把計算機的二進位制資料翻譯**類的語言呈現出來。

16進製制用於縮寫(簡寫)2進製,將2進製從後向前每4位數轉換為1位16進製制

補碼: 將固定位數的2進製數分一半作為負數使用的編碼規則。其目的是為了解決負數計算問題。

以4位補碼為例研究補碼的編碼規則! 將4位2進製分一半作為負數使用。

這種規則下減法也可以用加法來計算,相鄰兩個數順時針方向增加1。

從0到最大值的計算無需多說,就按二進位制來算就行。

負數的二進位制換算方法:負數可以跟-1比較,-1是所有位都為1,拿到乙個二進位制負數,只要看它比-1小多少就可以算出它對應的十進位制數:

11111111 11111111 11111111 11101010

11111111 11111111 11111111 111111111(-1)

以上面這個數為例,上面這個數比-1少了(1+4+16=21),所以它的十進位制就是-1-21=-22.

在這種編碼規則下還有個特點,就是乙個數求反再加一就是它的相反數,即:n=~n+1;

經典面試題目:

system.out.println(~100+1);

如上**的輸出結果:

a. -99 b.-100 c.-101 d.-102

答案:b

100 00000000 00000000 00000000 01100100

~100 11111111 11111111 11111111 10011011 -101

~100+1 11111111 11111111 11111111 10011100 -100

system.out.println(~100);

如上**的輸出結果:

a. -99 b.-100 c.-101 d.-102

答案:c

位運算子有:

與 & 、 或| 、異或^、取反~ 、左移位<< 、

數學右移位(有符號右移)>> 、邏輯右移位(無符號右移)>>>

計算規則:

0 & 0 -> 0

0 & 1 -> 0

1 & 0 -> 0

1 & 1 -> 1

有0則0

計算時候,將兩個數對其位數,將齊的數字進行 「&」 計算

舉個栗子:

n=     01110100 01111101 00101111 01101011

m= 00000000 00000000 00000000 11111111

k=n&m 00000000 00000000 00000000 01101011

如上計算的意義:k是n的最後8位數!也就將n的最後8位切下放到k中。

稱為掩碼(mask)計算,其中m稱為掩碼(mask),m有8個1時候稱為8位掩碼

**:

int n = 0x747d2f6b;

int m = 0xff;// 0xf 0x3f 0xffff

int k = n&m;

//按照2進製輸出 n m k 的值

規則: 將數字整體向右移位,高位補,低位自動溢位

舉個栗子:

n=        01101001 11111010 01110000 01010101

m=n>>>1 001101001 11111010 01110000 0101010

k=n>>>2 0001101001 11111010 01110000 010101

g=n>>>8 00000000 01101001 11111010 01110000

**:

int n = 0x69fa7055;

int m = n>>>1;

int k = n>>>2;

int g = n>>>8;

//將整數n拆分為4個位元組 b1 b2 b3 b4

int b1 = (n>>>24) & 0xff;

int b2 = (n>>>16) & 0xff

int b3 = (n>>>8) & 0xff;

int b4 = n & 0xff;

應用:與運算和右移配合可以實現用某種長度的掩碼把資料分段擷取,資料傳輸經常這樣使用

基本規則:

0 | 0 -> 0

0 | 1 -> 1

1 | 0 -> 1

1 | 1 -> 1

有1則1

將兩個數對齊位置,對應數字進行 或計算

舉個栗子:

n = 	 00000000 00000000 11001101 00000000  n=0xcd00

m = 00000000 00000000 00000000 11011111 m=0xdf;

k =n|m 00000000 00000000 11001101 11011111 k=n|m

b1= 00000000 00000000 00000000 11011101 b1=0xdd;

b2= 00000000 00000000 00000000 01101110 b2=0x6e;

b3= 00000000 00000000 00000000 10111011 b3=0xbb;

b4= 00000000 00000000 00000000 10101101 b4=0xad;

//左移運算子

b1<<24 11011101 00000000 00000000 00000000

b2<<16 00000000 01101110 00000000 00000000

b3<<8 00000000 00000000 10111011 00000000

b4= 00000000 00000000 00000000 10101101

x= 11011101 01101110 10111011 10101101

b1 b2 b3 b4

x= (b1<<24)|(b2<<16)|(b3<<8)|b4

應用:或運算配合左移剛好可以完成資料的拼接,也是在資料傳輸中使用

複習: 移動小數點計算

如:                  52439.

小數點向右移動一次: 524390. 數字擴大10倍

小數點向右移動二次: 5243900. 數字擴大100倍

假如小數點不動,數字向左移動:數字向左移動一次,數字擴大10倍

2進製時候: 數字向左移動:數字向左移動一次,數字擴大2倍

128 64 32 16 8 4 2 1

0 0 1 1 0 0 1 0

0 1 1 0 0 1 0 0 <<1

邏輯右移位 >>> 數學右移位 >> 的區別數學右移位 >> 計算的結果是: 資料除以2向小取整數的結果

區別:

邏輯右移位 >>> 移位時候,正數高位補0 負數高位補0,單純將數字向右移動,用於數字的拆分計算

數學右移位 >> 移位時候,正數高位補0 負數高位補1,用於替代特殊除法計算

舉個栗子:

n=      11111111 11111111 11111111 11001110   -50    

m=n>>1 111111111 11111111 11111111 1100111 -25

k=n>>2 1111111111 11111111 11111111 110011 -13

x=n>>>1 011111111 11111111 11111111 1100111

y=n>>>2 0011111111 11111111 11111111 110011

邏輯右移位 >>> 單純將數字向右移動,用於數字的拆分計算

數學右移位 >> 用於替代特殊除法計算

二進位制位運算

與運算,6 3 2 或運算 6 3 7 異或運算 6 3 5 反碼 6 7 左移 3 2 12 3 2 2 12 右移 3 1 1 3 2 1 無符號右移 3 1 1 3 2 1 按位與,當兩位同時為1時才為1如 1 1 1 1 0 0 0 1 0 6 3相當於 0110 0011 0010 2 按...

二進位制位運算

一 按位與 位全為1,結果才為1 0 0 0 0 1 0 1 0 0 1 1 1 特殊用法 清零。如果想將乙個單元清零,就是使其全部二進位制位為0,只要與乙個各位都為零的數值相與,結果為零 取乙個數中的指定位。如x 10101110要取x的低4位,用x 00001111 00001110即可 二 按...

位運算 顛倒二進位制位

a代表某字串 a b 異或 相同為0,不同為1 若b是一串0,則a b a,a b 0 a a 0 若b是一串1,則a b a,相當於把a取反,a b a a a a 利用x x 0,可以將三個數中重複的兩個數去掉 n 相當於無符號右移,左邊會補上0 獲取11111111,只需要把0取反 得到倒數第...