位運算針對的是二進位,所以需要將進行位運算的數現轉成在記憶體中二進位的表示形式 左移或右移 例如: 3 << 2 = 12 原理就是: 左移就是從左邊開始去掉幾位,就在最後面添加0,補成32位 右移同理,在前面補0還是1要看最高位(最左邊)是0還是1。 計算方法: 左移:往左移幾位就乘以2的幾次冪 ( ...
位運算針對的是二進位,所以需要將進行位運算的數現轉成在記憶體中二進位的表示形式
左移或右移
例如: 3 << 2 = 12
記憶體中二進位(32位): 0000 0000 0000 0000 0000 0000 0000 0011
左移後的結果為(32位): 0000 0000 0000 0000 0000 0000 0000 1100
原理就是:
左移就是從左邊開始去掉幾位,就在最後面添加0,補成32位
右移同理,在前面補0還是1要看最高位(最左邊)是0還是1。
計算方法: 左移:往左移幾位就乘以2的幾次冪 (就是乘以2的移動位數次冪)
3 << 2 等價 3 * 2的2次冪 3 << 3 等價 3 * 2的3次冪
右移: 同理往右移幾位就除以2的幾次冪 (除以2的移動的位數次冪)
>> : 有符號的右移
>>>: 無符號右移無論最高位是什麼,右移後,前面都補0
&運算: 1 & 1 = 1 、1 & 0 = 0、0 & 0 = 0 由此可以進行&運算
例如:
6 & 3 = 2
0000 0000 0000 0000 0000 0000 0000 0110
& 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------------------------
0000 0000 0000 0000 0000 0000 0000 0010
| 運算 : 1 | 1 = 1 、1 | 0 = 1、0 | 0 = 0 由此可以進行 | 運算
例如:
6 | 3 = 7
0000 0000 0000 0000 0000 0000 0000 0110
| 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------------------------
0000 0000 0000 0000 0000 0000 0000 0111
^ 異或 : 相同為false , 不同為true
(ps: 一個數異或同一個數兩次,結果還是那個數,可以用在數據加密上)
例如:
6 ^ 3 = 5
0000 0000 0000 0000 0000 0000 0000 0110
^ 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------------------------
0000 0000 0000 0000 0000 0000 0000 0101
~ 取反: 0和1互換,得到的結果減一再取反就得到十進位的數,然後加上負號就是結果
例如:
~6 = - 7
0000 0000 0000 0000 0000 0000 0000 0110
取反 1111 1111 1111 1111 1111 1111 1111 1001
減一 0000 0000 0000 0000 0000 0000 0000 0001
結果 1111 1111 1111 1111 1111 1111 1111 1001
取反 0000 0000 0000 0000 0000 0000 0000 0110 = 7
加上負號最終結果是 -7
一個負數的等價於對應的正數取反加一
-6 = ~6 + 1
小技巧:不使用第三個變數交換兩個數
int n = 3, m = 5;
//使用加法
n = n + m; //n = 8
m = n - m; //8 - 5 = 3 m = 3
n = n - m; //8 - 3 = 5 n = 5
//使用異或
n = n ^ m;
m = n ^ m; // (n^m)^m 結果是n 此時m是n
n = n ^ m; //( n ^ m)^ n 結果是 m