2014-12-13 2 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 бит). Переменные байтов типа, 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

байт Ь = (байт) 0xF1 будет 1111 0001

байт d = (байт) (б >>> 4) будет 1111 1111

д >> 4 будет 11111111

0x0F будет 00001111

(д >> 4) & 0x0F будет 00001111 == 15

д будет 11111111

0f будет 00001111

шестигранной [d & 0x0F] будет 00001111 == 15

Так Окончательный ответ: 0xff

Я думаю, что вы ожидаете (байт) (б> >> 4) сдвинуть 0 слева направо 4 раза. Но b является целым числом с 32 битами, он будет перемещать 4 байта слева, но проигнорируется путем (байтового) преобразования. преобразование байта принимает 8 младших значащих бит целого числа.