2017-01-29 12 views
0

В Java, у меня есть следующий код:Выполнить побитовое ИЛИ без расширения знака в Java

byte lo = 0x88; 
    byte hi = 0x0; 
    short x = 0; 
    x |= lo; 
    x |= (short) ((short) hi << 8); // FIXME double cast ?? 
    return x; 

После первой операции, значение в кратко- является 0xff88. Я понимаю, это потому, что Java не поддерживает беззнаковые числа.

Как я могу заставить его игнорировать знак? Я не использую эти данные непосредственно в Java-коде, так что это не имеет значения, не так ли?

+2

'byte lo = 0x88;' не компилируется и его значение находится за пределами диапазона чисел, представляемых 'byte'. – manouti

+0

@ AR.3 Я хотел бы знать, как избежать знака. –

+1

Ваш текущий код не компилируется. Не могли бы вы привести полный рабочий пример? – Bubletan

ответ

1

Знак появляется, когда байт преобразуется в int перед выполнением побитовой операции. Преобразование должно подписать расширение значение byte, потому что byte является подписанным типом в Java. Преобразование должно происходить из-за того, что побитовые операции - это операции с значениями int или long.

Есть два решения:

  1. маска верхних бит, либо после преобразования в int, или после выполнения побитового ИЛИ; например

    x |= (lo & 0xff); 
    x |= (hi & 0xff) << 8; 
    

    (Оказывается, что маскировка не является необходимой для hi ... из-за того, что вы делаете позже. Тем не менее, есть вероятность, что JIT компилятор оптимизирует прочь все ненужные инструкции маскирования. И если это Безразлично» т, накладные расходы настолько мала, что это вряд ли имеет значение.)

  2. Использование Byte.toUnsignedInt(byte) для преобразования byte к int.

+0

Благодарим вас за полезный ответ. Это решило проблему. –