逢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取反 得到倒數第...