回覆列表
  • 1 # 使用者6882895779306

    算術移位:>>,有符號的移位操作,右移之後的空位用符號位補充,如果是

    正數用 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? - 計算機科學

  • 中秋節和大豐收的關聯?
  • 送向日葵代表什麼意思?