2014-12-13 114 views
1

公共類UnsignedShift {位運算符

public static void main(String[] args) { 

    char hex[] = new char[] {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; 


    byte b = (byte) 0xf1; 
    byte d = (byte)(b>>>4); 


    System.out.println("b>>>4=0x" + hex[(d>>4)&0x0f] + hex[d&0x0f]); 

    } 

}

結果= 0xFF的

任何人都可以解釋它是如何可能在Java中?

我認爲,這是爲0x0F

回答

1

有在Java沒有二進制運算符可以直接與字節(8位)操作。類型爲byte,short或char的變量在執行類似這些操作之前會自動將數字提升爲32位整數,詳見here。 因此,這裏是你的代碼會發生什麼:

public static void main(String[] args) { 

    char hex[] = new char[] {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; 

    byte b = (byte) 0xf1; // b is a byte with 0xf1 
    byte d = (byte)(b>>>4); // b is converted to int, becoming 0xfffffff1 then shifted 
          // to the right by 4 bits, resulting in 0x0fffffff 

    System.out.println("b>>>4=0x" + hex[(d>>4)&0x0f] + hex[d&0x0f]); 

} 

如果你想獲得它只是更容易在下面的例子中使用32個變量對所有二進制運算,這樣的權利:

public static void main(String[] args) { 
     char hex[] = new char[] {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; 

     byte b = (byte) 0xf1; 
     int ib = b & 0xff; 
     byte d = (byte)(ib>>>4); 

     System.out.println("b>>>4=0x" + hex[(d>>4)&0x0f] + hex[d&0x0f]); 
} 

注意:如果您不知道,可以通過調用Integer.toHexString(n)輕鬆打印十六進制格式的整數。

0

字節B =(字節)的0xf1將1111 0001

字節d =(字節)(B >>> 4)將1111 1111

d >> 4將是11111111

爲0x0F將00001111

(d >> 4)&爲0x0F將00001111 == 15

d將是11111111

0F將是00001111

六角[d &爲0x0F]將是00001111 == 15

所以最終的答案:0xFF的

我想你期待(字節)(B> >> 4)將0從左向右移動4次。但是b是一個32位的整數,它將從左邊移動4個字節,但被(字節)轉換忽略。字節轉換佔用整數的8個最低有效位。