2015-01-22 2 views
1

Im пытаясь понять следующий фрагмент кода:Java: 4 байт 32-битная целое

int omgezetteTijd = ((0xFF & rekenOmNaarTijdArray[0]) << 24) | ((0xFF & rekenOmNaarTijdArray[1]) << 16) |((0xFF & rekenOmNaarTijdArray[2]) << 8) | (0xFF & rekenOmNaarTijdArray[3]);

То, что я не понимаю, почему вас и с OxFF, вы Андинг в 8 битное значение с такими 8 битами (11111111), поэтому это должно дать вам тот же результат.

Но, когда я этого не делаю И это с OxFF Я получаю отрицательные значения? Не могу понять, почему это происходит?

+0

Почему вы выполняете работу над тем, что «ByteBuffer» может сделать для вас? – fge

+0

Потому что я хочу понимать разные типы данных и знаю, как их использовать :) – Pim

ответ

4

Когда вы или байт с int байтом будет назначен на int. По умолчанию это делается с помощью sign extension. Другими словами:

      //      sign bit 
          //       v 
byte b = -1;    //       11111111 = -1 
int i = (int) b;   // 11111111111111111111111111111111 = -1 
          // \______________________/ 
          //  sign extension 

Выполняя & 0xFF, вы предотвращаете это. То есть

      //      sign bit 
          //       v 
byte b = -1;    //       11111111 = -1 
int i = (int) (0xFF & b); // 00000000000000000000000011111111 = 255 
          // \______________________/ 
          //  no sign extension 
+0

круто, спасибо за помощь, ребята! Я получаю это сейчас! – Pim

+0

Добро пожаловать. Если это ответит на ваш вопрос, не стесняйтесь принять его. – aioobe

3

0xFF как byte представляет собой число -1. Когда он преобразуется в int, он все еще равен -1, но имеет битовое представление 0xFFFFFFFF, из-за расширения знака. & 0xFF избегает этого, рассматривая байт как unsigned при преобразовании в int.

Смежные вопросы