二進位制與位運算

2022-08-17 21:18:08 字數 1398 閱讀 9028

目錄常見的位運算應用

計算機中,為了方便計算,整數一般在計算機中都以補碼的形式儲存

補碼與原碼的轉換

為了演示方便,以下位運算均以8位的byte進行操作,且計算機中位運算都是以補碼的形式參與位運算

按位與

同為1則位1,否則為0

按位或
全0為0,否則為1

按位非
直接取反,遇1則0,遇0則1

按位異或
相同為0,不同為1

左移<<: 左移運算子,將操作書的二進位制整體左移,右邊補0

- 正數的左移n位,結果為 正數 * 2的(n%資料型別的長度)次方,

右移>>:將操作書的二進位制整體右移指定位數,空出的位以符號位為準填充

- 正數的右移n位,結果為 正數/2的(n%資料型別長度)次方

- 負數右移最終結果為-1,因為'111111111111111111111'就是-1的補碼形式

無符號右移

低位捨棄,高位補0

位運算的優先順序對於任意整數a和b,以下表示式結果均成立

判斷奇偶數

a & 1 == 0:a為偶數

a & 1 == 1:a為奇數

原理:偶數的二進位制的最後一位為0,而奇數的最後一位為1,而參與位運算的1除了最後一位為1,其餘全為0,結果也是不言而喻,偶數的結果就是0,奇數最後一位1&1,結果就為1

交換變數

乙個整數異或乙個相同的數數次,其結果仍為這個數字.

int a = 2;

int b = 3;

a ^= b;

b ^= a;//b = b^a 拆開來就是 b = b ^(a ^b) 此時b就=a了

a ^= b;//a = a^b 拆開來就是 a = (a ^b) ^ b 此時a就=b了

變換符號

system.out.println(-2 == (~2 +1));結果為true,~a + 1 等價於 -a

求絕對值

int i = a>>(a的長度-1);//此處長度指的是基本資料型別short,byte,int,long的長度,如果a是整數則得到的結果為0,負數則為-1

system.out.println( i == 0?a:(~a + 1));

5.取餘運算

a%b == a&(b-1)注意:只有b為2的n次方的時候可以使用此方法

二進位制位運算

與運算,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取反 得到倒數第...