как добавить два бита в шестнадцатеричный

У меня два байта, и я устанавливаю разные биты, чтобы получить разные комбинации. Например, байт 1 бит 7 и байт 2 бит 1, бит 2 делают комбинированное устройство готовым. Теперь я создал маску

#define C1_device_ready   (0x80 | 0x100 | 0x200)

Затем читаю данные и пытаюсь сравнить. для 1 байта я могу (data [0] & mask == mask). Но как я могу вычислить это для маски C1_device_ready, где есть два байта, data [0] и data [1]. Возможно ли это легко, или я должен делать маскировку только в одном байте. :: added :: data is unsigned char data [2]


person user1566277    schedule 10.08.2012    source источник


Ответы (4)


Если data является массивом unsigned char, вы можете протестировать

if ((data[0] & mask) == (mask & 0xFF) && (data[1] & mask) == ((mask >> 8) & 0xFF))

или объедините два data[i] и проверьте

if (((data[0] | (data[1] << 8)) & mask) == mask)
person Daniel Fischer    schedule 10.08.2012
comment
Спасибо, что работает. Не могли бы вы объяснить смещение битов (‹---------------- 8). - person user1566277; 10.08.2012
comment
data[0] | (data[1] << 8) объединяет два байта из массива data в один int, имеющий data[0] в младшем байте и data[1] во втором младшем байте за сдвиг. Поскольку битовые операции << и | автоматически вызывают целочисленное преобразование, нет необходимости вручную вставлять приведение к большему типу. - person Daniel Fischer; 10.08.2012

Использовать

if (((data[0] | (data[1] << 8)) & mask) == mask) {
    // do something
}
person Community    schedule 10.08.2012

((data[0] | (data[1]<<8)) & mask) == mask

должно сработать. Может потребоваться преобразовать вещи как unsigned int

person Ed Heal    schedule 10.08.2012

Пытаться:

if ((*(short *)data) & C1_device_ready)
person svinja    schedule 10.08.2012