標籤:移動 個數 奇數 還原 變數 nbsp bsp 原碼 異或
位元運算1).定義.
指的是1個位元據的每一位來參與運算.
位元運算的前提: 是這個數必須是1個二進位.
注意:
a). 參與位元運算的位元據必須是補碼形式.
b). 位元運算的結果也是二進位的補碼形式.
2).按位與: &
參與按位與的兩個位元.如果都為1 那麼結果就為1 只要有1位為0 那麼結果就為0.
3 & 2;
第1步驟:先得到兩個數的二進位補碼形式.
3的補碼: 00000000 00000000 00000000 00000011
2的補碼: 00000000 00000000 00000000 00000010
-------------------------------------------------------
00000000 00000000 00000000 00000010 2
-3 & 4;
-3的原碼:10000000 00000000 00000000 00000011
-3的反碼:11111111 11111111 11111111 11111100
-3的補碼:11111111 11111111 11111111 11111101
4的補碼: 00000000 00000000 00000000 00000100
------------------------------------------------------
00000000 00000000 00000000 00000100
-3 & -4;
-4的原碼: 10000000 00000000 00000000 00000100
-4的反碼: 11111111 11111111 11111111 11111011
-3的補碼:11111111 11111111 11111111 11111101
-4的補碼:11111111 11111111 11111111 11111100
-----------------------------------------------------
11111111 11111111 11111111 11111100
結果是補碼: 現將其還原為反碼
反碼: 11111111 11111111 11111111 11111011
原碼: 10000000 00000000 00000000 00000100
注意:
任何數按位與1的結果是:是這個數的最低位.
10 & 1
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx0
00000000 00000000 00000000 00000001
------------------------------------
00000000 00000000 00000000 00000000
偶數的最低位一定是0. 奇數的最低為一定是1
所以,如果要判斷這個數是奇數還是偶數 只要用這個數按位與1就可以了.
如果結果為1 那麼就是奇數 如果結果為0 那麼結果就是偶數.
int num = 10;
if((num & 1) == 0)
{
偶數.
}
else
{
奇數.
}
3). 按位或. |
參與按位或的位元據 只要有1位是1 那麼結果就為1 只有當兩位都是0的時候結果才為0
3 | 2;
3的補碼: 00000000 00000000 00000000 00000011
2的補碼: 00000000 00000000 00000000 00000010
------------------------------------------------------
00000000 00000000 00000000 00000011
-3 | 4
-3的補碼:11111111 11111111 11111111 11111101
4的補碼: 00000000 00000000 00000000 00000100
------------------------------------------------------
11111111 11111111 11111111 11111101
結果是1個負數.
反碼: 11111111 11111111 11111111 11111100
原碼: 10000000 00000000 00000000 00000011
-3 | -4
-3的補碼:11111111 11111111 11111111 11111101
-4的補碼:11111111 11111111 11111111 11111100
-------------------------------------------------------
11111111 11111111 11111111 11111101
4). 按位取反: ~
單目運算子. 將這個位元的每一位取反.
~3;
3的補碼: 00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111100 補碼
11111111 11111111 11111111 11111011 反碼
10000000 00000000 00000000 00000100 原碼
5). 按位異或: ^
參與按位異或的位元據的位 如果相同則為0 不同為1.
3 ^ 2;
00000000 00000000 00000000 00000011 3的補碼
00000000 00000000 00000000 00000010 2的補碼
--------------------------------------
00000000 00000000 00000000 00000001 1
交換兩個變數的值可以用異或運算.
int a = 3;
int b = 2;
a = a ^ b; a = 1
b = a ^ b; b = 3
a = a ^ b; b = 2
1 ^ 2
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000010
-------------------------------------------------------
00000000 00000000 00000000 00000011 3
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000011
------------------------------------------------------
00000000 00000000 00000000 00000010 2
6). 按位左移運算. <<
參與按位左移運算的位元據. 向左移動指定的位元. 低位不夠補0 高位溢出就丟棄.
3 << 2;
00000000 00000000 00000000 00000011
000000 00000000 00000000 0000001100
12
注意:
a). 左移運算有可能會改變其正負性.
b). 將1個數左移n位,相當於將這個數 乘以 2的n次方.
3 << 2 3乘以2的2次方.
16 << 3; 16 * 8 128
5 * 16 = ????
5 << 4
7). 按位右移. >>
參與按位右移的位元據.向右移動指定的位元. 低位溢出丟棄,高位補符號位.
3 >> 2;
00000000 00000000 00000000 00000011
0000000000 00000000 00000000 000000
16 >> 2;
00000000 00000000 00000000 00010000
00000000 00000000 00000000 000100
-16 >> 3
10000000 00000000 00000000 00010000
11111111 11111111 11111111 11101111
11111111 11111111 11111111 11110000
11111111111 11111111 11111111 11110
11111111111 11111111 11111111 11101 反碼
10000000000 00000000 00000000 00010
注意.
a). 右移運算不會改變正負性.
b). 1個數按位右移n位.相當於這個數除以2的n次方.
100 >> 2 相當於 100 / 4
C語言之位元運算