在MSB和无符号字符的LSB上写入

时间:2014-02-04 14:20:36

标签: c++ c bit-manipulation bit

我有一个unsigned char,我想在最重要的四个上写0x06,我想在它的4个最低有效位上写0x04。 所以Char表示应该像0110 0010

有些人可以指导我如何在C中做到这一点吗?

3 个答案:

答案 0 :(得分:3)

c = (0x06 << 4) | 0x04;

由于:

0x04    = 0000 0100
0x06    = 0000 0110

0x06<<4 = 0110 0000
or op:  = 0110 0100

答案 1 :(得分:0)

使用按位移位运算符将值移动到正确的位置,并按位组合。

unsigned char c = (0x6 << 4) | 0x4;

要反转过程并提取位域,您可以使用按位,并使用仅包含您感兴趣的位的掩码:

unsigned char lo4 = c & 0xf;
unsigned char hi4 = c >> 4;

答案 2 :(得分:0)

首先,确保每个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设置为高4位中的6和低4位中的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;

以上假设ab仅包含四位值。如果他们可能设置了其他位,请分别使用(a & 0xf)(b & 0xf)代替上面的ab