У меня есть unsigned char, и я хочу написать 0x06
по четырем наиболее значимым, и я хочу записать 0x04
на его 4 младших значащих бита. Таким образом, представление Char должно быть похоже на 0110 0010
Может ли кто-нибудь направить меня, как я могу это сделать в C?
c = (0x06 << 4) | 0x04;
Потому как:
0x04 = 0000 0100
0x06 = 0000 0110
0x06<<4 = 0110 0000
or op: = 0110 0100
Во-первых, убедитесь, что в unsigned char
имеется восемь бит:
#include <limits.h>
#if CHAR_BIT != 8
#error "This code does not support character sizes other than 8 bits."
#endif
Теперь предположим, что у вас уже есть unsigned char
определенный с помощью:
unsigned char x;
Затем, если вы хотите полностью установить unsigned char
должен иметь 6 в высоких четырех битах и 4 в младших четырех битах, используйте:
x = 0x64;
Если вы хотите видеть высокие биты для a
и младших бит в b
, используйте:
// Shift a to high four bits and combine with b.
x = a << 4 | b;
Если вы хотите установить высокие биты в a
и оставить низкие биты без изменений, используйте:
// Shift a to high four bits, extract low four bits of x, and combine.
x = a << 4 | x & 0xf;
Если вы хотите установить низкие биты в b
и оставить высокие биты без изменений, используйте:
// Extract high four bits of x and combine with b.
x = x & 0xf0 | b;
Вышеизложенное предполагает, что a
и b
содержат только четырехбитовые значения. Если у них могут быть установлены другие биты, используйте (a & 0xf)
и (b & 0xf)
вместо a
и b
выше, соответственно.
Переместите значения в правильное положение с помощью операторов побитового сдвига и объедините их с поразрядным или.
unsigned char c = (0x6 << 4) | 0x4;
Чтобы отменить процесс и извлечь битовые поля, вы можете использовать поразрядные и с маской, содержащей только интересующие вас биты:
unsigned char lo4 = c & 0xf;
unsigned char hi4 = c >> 4;
c = 0x64;
?