算術移位:>>,有符號的移位操作,右移之後的空位用符號位補充,如果是
正數用 0 補充,負數用1補充。
例1:
-4>>1
-4的原碼
10000000 00000000 00000000 00000100
-4的補碼
11111111 11111111 11111111 11111100
0 向右移出 1 位後
11111111 11111111 11111111 11111110
重新取反加一變原碼:答案 -2
10000000 00000000 00000000 00000010
邏輯右移:>>>,不管正數、負數,左端都用0補充。
例2:-1>>>1
10000000 00000000 00000000 00000001 -1的原碼
11111111 11111111 11111111 11111111 -1的補碼
01111111 11111111 11111111 11111111 1 向右移出1位後直接給出答案:2^31-1
例3:6>>>2
00000000 00000000 00000000 00000110 6的原碼
00000000 00000000 00000000 00000001 10 向右移出2位後直接給出答案:1
--------------------------------------------------------------------------------------------------------------------------
補充一個例子
byte b = -64;
(b & 0xFF ) >> 4 算術右移4位之後可以拿到高4位的值,原理:
由於移位是以32位為標準的(Why?)
10000000 00000000 00000000 01000000 -64原碼
11111111 11111111 11111111 11000000 -64補碼
和0xFF相與之後,
00000000 00000000 00000000 11000000 然後算術右移位
00000000 00000000 00000000 0000 1100 12
--------------------------------------------
( b >>> 4 ) & 0x0F 也可以拿到高4位的值 原理:
同上
邏輯右移之後
00001111 11111111 11111111 11111100
跟0x0F相與之後
00000000 00000000 0000000 00001100 也是12
拿低4位更簡單了
直接 b & 0x0F 就是了
--------------------------------------------------------------------------------
Long等基本資料型別的裝箱型別有個判斷符號位正負的方法,現舉例如下:
如果long是正數,則左邊是0000 0000 0000 0000 0000 0000 0000 0000 .......0000
右邊是0000 0000 0000 ....................................................1
則最終結果是+1;
如果long是負數,
則左邊是11111111111111111111111..................111111111111
右邊是 00000000000000000000000...................000000000000
則最終結果是-1
如果long是0,
左邊0的補碼是000000000000000000000000000000000000000000000
-0的補碼也是 000000000000000000000000......................000000000
所以結果是0
為什麼-0的補碼是00000000? - 計算機科學
算術移位:>>,有符號的移位操作,右移之後的空位用符號位補充,如果是
正數用 0 補充,負數用1補充。
例1:
-4>>1
-4的原碼
10000000 00000000 00000000 00000100
-4的補碼
11111111 11111111 11111111 11111100
0 向右移出 1 位後
11111111 11111111 11111111 11111110
重新取反加一變原碼:答案 -2
10000000 00000000 00000000 00000010
邏輯右移:>>>,不管正數、負數,左端都用0補充。
例2:-1>>>1
10000000 00000000 00000000 00000001 -1的原碼
11111111 11111111 11111111 11111111 -1的補碼
01111111 11111111 11111111 11111111 1 向右移出1位後直接給出答案:2^31-1
例3:6>>>2
00000000 00000000 00000000 00000110 6的原碼
00000000 00000000 00000000 00000001 10 向右移出2位後直接給出答案:1
--------------------------------------------------------------------------------------------------------------------------
補充一個例子
byte b = -64;
(b & 0xFF ) >> 4 算術右移4位之後可以拿到高4位的值,原理:
由於移位是以32位為標準的(Why?)
10000000 00000000 00000000 01000000 -64原碼
11111111 11111111 11111111 11000000 -64補碼
和0xFF相與之後,
00000000 00000000 00000000 11000000 然後算術右移位
00000000 00000000 00000000 0000 1100 12
--------------------------------------------
( b >>> 4 ) & 0x0F 也可以拿到高4位的值 原理:
同上
邏輯右移之後
00001111 11111111 11111111 11111100
跟0x0F相與之後
00000000 00000000 0000000 00001100 也是12
拿低4位更簡單了
直接 b & 0x0F 就是了
--------------------------------------------------------------------------------
Long等基本資料型別的裝箱型別有個判斷符號位正負的方法,現舉例如下:
如果long是正數,則左邊是0000 0000 0000 0000 0000 0000 0000 0000 .......0000
右邊是0000 0000 0000 ....................................................1
則最終結果是+1;
如果long是負數,
則左邊是11111111111111111111111..................111111111111
右邊是 00000000000000000000000...................000000000000
則最終結果是-1
如果long是0,
左邊0的補碼是000000000000000000000000000000000000000000000
-0的補碼也是 000000000000000000000000......................000000000
所以結果是0
為什麼-0的補碼是00000000? - 計算機科學