2 байта для закорачивания Java

В Python 3, когда вы говорите space = height / 2 - n, он автоматически переводит результат в число с плавающей точкой, поэтому spaces будет 4.0 - 1 = 3.0. Вам нужно будет привести его к int, чтобы умножить на него строку.

30
задан Reinstate Monica - M. Schröder 22 June 2015 в 10:01
поделиться

4 ответа

При преобразовании байтовых значений из потока в числовые значения в Java вы должны быть очень осторожны с расширением знака. Есть ловушка с отрицательными числами (значения от (без знака) 128-255).

Попробуйте это (это работает, если hi и lo являются любыми типами Java integer):

short val=(short)(((hi & 0xFF) << 8) | (lo & 0xFF));

Я считаю, что в этих случаях лучше указывать скобки.

29
ответ дан Lawrence Dol 27 November 2019 в 23:03
поделиться

Это происходит при попытке объединить байты (очень тонко)

byte b1 = (byte) 0xAD;
byte b2 = (byte) 0xCA;
short s = (short) (b1<<8 | b2);

Выше приведено 0xFFCA, что неверно. Это потому, что b2 отрицателен (тип байта подписан!), Что означает, что когда он будет преобразован в тип int для побитового | операции, он будет дополнен слева 0xF!

Поэтому вы должны помнить, чтобы маскировать дополненные байты так, чтобы они точно были равны нулю:

short s = (short) (b1<<8 | b2 & 0xFF);
6
ответ дан Lake 27 November 2019 в 23:03
поделиться

Помните, что вам не нужно завязывать узлы со сдвигом бит, если вы не слишком знакомы с подробности. Вы можете использовать ByteBuffer, чтобы выручить вас:

ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(firstByte);
bb.put(secondByte);
short shortVal = bb.getShort(0);

И наоборот, вы можете поставить короткие, а затем вытащить байты.

Кстати, побитовые операции автоматически переводят операнды по крайней мере на ширину int. На самом деле нет понятия «не разрешено сдвигать байт более чем на 7 бит» и другие слухи, которые, кажется, распространяются.

60
ответ дан Neil Coffey 27 November 2019 в 23:03
поделиться

Другие ответы в порядке, но я хотел бы сделать акцент на типе:

short high=(-48 & 0x00ff);
short low=80;

int c= ((high & 0xFF) << 8) | (low & 0xFF);

Тип short может представлять значения от -32768 до 32767. 53328 не может быть красиво сохранен вкратце, используйте вместо него int , так как это позволяет хранить беззнаковое значение до ~ 10 9 Так что не уменьшайте выражение до короткого, так как оно даст вам значение со знаком.

9
ответ дан 27 November 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: