java - числа - простое число c++



Как разделить целое число на 2 байтовых двоичных файла? (5)

Для преобразования двух байтов наиболее чистое решение

data[0] = (byte) width;
data[1] = (byte) (width >>> 8);

Для преобразования целого числа в четыре байта код будет

data[0] = (byte) width;
data[1] = (byte) (width >>> 8);
data[2] = (byte) (width >>> 16);
data[3] = (byte) (width >>> 24);

Не имеет значения, используется ли >> или >>> для переключения, любые биты, созданные расширением знака, не будут попадать в результирующие байты.

См. Также этот ответ .

https://src-bin.com

Данный

private int width = 400;
private byte [] data = new byte [2];  

Я хочу разбить целочисленную «ширину» на два байта и загрузить данные [0] с высоким байтом и данными [1] с младшим байтом.

Это двоичное значение 400 = 1 1001 0000, поэтому данные [0] должны содержать 0000 0001, а данные [1] должны содержать 1001 0000


Answer #1

Использование простых побитовых операций:

data[0] = (byte) (width & 0xFF);
data[1] = (byte) ((width >> 8) & 0xFF);

Как это работает:

  • & 0xFF маскирует все, кроме наименьших восьми бит.
  • >> 8 отбрасывает самые младшие 8 бит, перемещая все биты на 8 мест вправо.
  • Приведение в байты необходимо, потому что эти побитовые операции работают с int и возвращают int , который является более крупным типом данных, чем byte . Случай безопасен, так как все ненулевые биты будут помещаться в byte . Дополнительные сведения см. В разделе « Конверсии и рекламные акции» .

Edit: Taylor L правильно отмечает, что, хотя >> работает в этом случае, это может привести к неправильным результатам, если вы обобщите этот код на четыре байта (поскольку в Java int 32 бита). В этом случае лучше использовать >>> вместо >> . Для получения дополнительной информации см. Учебник по Java по операциям бит и бит .


Answer #2

Чтобы получить старший байт, сдвиньте налево на 8 бит, затем залейте верхние байты. Аналогично, чтобы получить низкий байт, просто закройте верхние байты.

data[0] = (width >> 8) & 0xff;
data[1] = width & 0xff;

Answer #3

Это должно делать то, что вы хотите для 4 байтов int. Обратите внимание, что он хранит младший байт при смещении 0. Я оставлю его в качестве упражнения для читателя, чтобы заказать их по мере необходимости.

public static byte[] intToBytes(int x) {
    byte[] bytes = new byte[4];

    for (int i = 0; x != 0; i++, x >>>= 8) {
        bytes[i] = (byte) (x & 0xFF);
    }

    return bytes;
}

Answer #4
int width = 400;
byte [] data = new byte [2];

data[0] = (byte) ((width & 0xFF00) >> 8);
data[1] = (byte) (width & 0xFF);

for(int b = 0; b < 2; b++) {
    System.out.println("printing byte " + b);
    for(int i = 7; i >= 0; i--) {
        System.out.println(data[b] & 1);
        data[b] = (byte) (data[b] >> 1);
    }
}




java