2016-10-05 78 views
0

我目前正在學習按位運算符,並且在「Java完整引用第九版」一書中遇到以下示例。使用右移運算符掩蔽符號擴展>>

我明白什麼是右移運算符>>,但我不完全確定這個例子是如何實際工作的(可能我不明白如何>>工作)。有人請向我解釋一下嗎?

有時,當您將它們移動到右側時,不希望簽名擴展值。例如,以下程序 將字節值轉換爲其十六進制字符串表示形式。注意 通過將其與0x0f進行AND運算以將任何 符號擴展位丟棄,以使該值可用作 十六進制字符數組的索引,從而屏蔽移位的值。

// Masking sign extension. 

class HexByte { 

    static public void main(String args[]) { 
     char hex[] = { 
      '0', '1', '2', '3', '4', '5', '6', '7', 
      '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' 
     }; 
     byte b = (byte) 0xf1; 
     System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]); 
    } 
} 
+1

開始解釋這將是有益的知道,如果你有二進制,十進制和十六進制的知識之前?如果你知道如何在這三個系統之間轉換數字,解釋要容易得多^^ –

+0

@MeinName我明白不同編號系統之間的區別。我可以在它們之間做一些基本的轉換,但有一定的時間和思考:) – Thor

回答

3

簽名左移由4保持原始數的符號。

然而((字節)0xf1)>> 4是-1這不是你想要的。

你只需要低4位,這是& 0x0f給你的低4位。這給你0xf這是最高的4位或15。

+2

爲什麼要(0xf1 >> 4)是-1?難道不是15? 編輯:哦,因爲它是一個字節^^ –

+2

@MeinName它是。 '(0x000000f1 >> 4)'是15.但是((字節)0xf1)>> 4)'是'(0xfffffff1 >> 4)'或-1 –

+0

@PeterLawrey謝謝你的解釋。這件事情很混亂。你對這個話題有什麼好的閱讀建議嗎?再次感謝你的幫助! – Thor

1

在你的例子中b被設置爲0xf1(11110001)。 B >> 4周的結果在這樣的:11111111

由於Java使用算術移位,執行右移之後,最左邊的數字將是1(不同於邏輯移位 whhich將在端留下一個零) 。

要解決這個問題,你執行11111111 &爲0x0F(00001111),其結果00001111.