2016-05-11 3 views
1

Я взаимодействую с унаследованной системой, которая принимает много ввода на уровне бит. Это требует, чтобы я передавал в октетах (действительно байты) с определенным набором бит.бит битрального байта с самым высоким битом

Чтобы это читаемым, я объявляю некоторые флаги, как это:

private static final byte FLAG_A = 0b00010000; 
private static final byte FLAG_B = 0b00100000; 
private static final byte FLAG_C = 0b00011000; 

Это прекрасно работает.

Странно то, что когда я устанавливаю самый старший бит (как показано ниже), компилятор начинает жаловаться, что находит int. Я мог бросить его, но мне это кажется странным. Это еще 8 бит, так что я бы ожидать, что она помещается в байтах (даже если два-дополнения обозначение заставляет его быть истолкован как отрицательные, что не имеет никакого значения для меня)

private static final byte FLAG_D = 0b10000000; 

Любой идею, что происходит на?

+0

'... = (байт) 0b10000000;' это самое простое решение; поэтому int 128 становится байтом -128. (Байт Java подписан -128..127, числовые переполнения отбрасываются) –

ответ

4

0bxxxx обозначения для битового представления целых чисел, которые могут быть переданы в байты, если они подходят, но это не специальная байтовая запись. 0b1000000 положительный +128, что больше, чем может поместиться в байт. Вам нужно будет сделать что-то вроде -0b111111 (-127) для достижения байтового шаблона 0b1000000, но, вероятно, лучше сделать явный приведение. То, что вы действительно ищете, - это неподписанный тип байта, которого нет в java.

-3

Вы можете объявить свой флаг, как

private static final unsigned byte 

Я предполагаю, что компилятор считает, что 255 не является уместным в к подписанному байт (который только holdes -128 до 127)

+3

В Java нет примитивных типов 'unsigned'. –

+0

Не видел тег Java, извините – SaschaZorn

1

Взяв его с места, где @Artur Biesiadowski остановился, вы по существу пытаетесь сохранить больше байта.

1 0 0 0 0 0 0 0 
7th 6th 5th 4th 3rd 2nd 1st 0th 

Это значение равно +128; Диапазон байтов Java - от -128 до +127 [read further here].

Более чистым и понятным способом может быть использование шестнадцатеричного кода вместо 0bxxx.

Теперь, поскольку вы просите сохранить +128 в виде данных, который может хранить максимум +127, он автоматически использует тип данных, который может хранить больший диапазон, то есть int посредством процесса продвижения по типу. [JLS 5.x] объясняет это очень подробно.

0

Альтернативным решением является использование BitSet с его более удобными для человека методами. Вы по-прежнему можете использовать флаги для отдельных битов, но они будут индексами вместо битмаски. Затем вы можете просто получить полученный байт с BitSet.toByteArray()[0].

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