2006/08/24

位元運算<<、>>、>>>與補數~

  常在網上看到正準備SCJP的的朋友在問,藉此整理一下...

  • << 左移運算子,將位元往左移,右邊補0。
1
2
3
4
5
例如:5 << 2
00000000 00000000 00000000 00000101
往左移2
000000 00000000 00000000 0000010100
再轉回10進位,所以結果為20

  • >> 右移運算子,將位元往右移,如果原本左邊為0就補0,為1時就補1。
1
2
3
4
5
例如:5 >> 2
00000000 00000000 00000000 00000101
往右移2
00000000 00000000 00000000 00000001
再轉回10進位,所以結果為1

1
2
3
4
5
例如:-5 >> 2
11111111 11111111 11111111 11111011
往右移2
11111111 11111111 11111111 11111110
再轉回10進位,所以結果為-2

  • >>> 無號右移運算子,將位元往右移,左邊補0。
1
2
3
4
5
例如:5 >>> 2
00000000 00000000 00000000 00000101
往右移2
00000000 00000000 00000000 00000001
再轉回10進位,所以結果為1,與>>相同

1
2
3
4
5
例如:-5 >>> 2
11111111 11111111 11111111 11111011
往右移2
00111111 11111111 11111111 11111110
再轉回10進位,結果為1073741822

另外,可以在Java中使用
1
2
3
4

DecimalFormat df = 
    new DecimalFormat("00000000,00000000,00000000,00000000");
BigDecimal bigDecimal = new BigDecimal(Integer.toBinaryString(-5 >>> 2));
System.out.println(df.format(bigDecimal));

來轉成2進位,方便驗算。
執行結果:
1

00111111,11111111,11111111,11111110

  • 補數:在Java中是以~符號代
1
2
3
4
5
5
例如:~1
1的二進位
00000000 00000000 00000000 00000001
補數為
11111111 11111111 11111111 11111110
轉為10進位時,就是-2

補數 = - (被補數 + 1)
所以10的補數,馬上就可以算出是-11

沒有留言: