如何在C中仅设置某个字节的某些位而不影响其余位?

PIC*_*ain 19 c byte bitmask

假设我有一个类似于1010XXXX的字节,其中X值可以是任何值.我想将低4位设置为特定模式,比如1100,同时保持高4位不受影响.如何在C中以最快的速度完成这项工作?

thk*_*ala 45

一般来说:

value = (value & ~mask) | (newvalue & mask);
Run Code Online (Sandbox Code Playgroud)

mask是一个值,所有要更改的位(并且只有它们)设置为1 - 在您的情况下它将是0xf.newvalue是一个包含这些位的新状态的值 - 所有其他位基本上都被忽略.

这适用于支持按位运算符的所有类型.

  • 您能举一个具体的例子吗?假设我有:n = 1024。我想将位置3到7(含,从最低有效位0开始)的位更改为k = 19。结果应该是:1176。我怎样才能实现它?谢谢。 (2认同)
  • 我自己必须弄清楚这一点,我想出了以下宏来概括该问题。(不知道为什么代码格式不起作用,抱歉) ``` #define MASK(L,P) (~(0xffffffff << (L)) << (P)) #define GET_VAL(BF,L,P) (((BF) & MASK(L,P)) >> P) #define SET_VAL(BF,L,P,V) ( (BF) = ((BF) & ~MASK(L,P)) | (( (V) << (P)) & MASK(L,P)) ) int main(int argc, char ** argv) { uint32_t bf = 1024; printf("之前的位域: %d , 0x%08x\n", bf, bf); SET_VAL(bf,5,3,19); printf("之后的位域: %d , 0x%08x\n", bf, bf); 返回0;} ``` (2认同)

Goz*_*Goz 14

您可以通过按位设置将所有这些位设置为0,将4位设置为0,将所有其他设置为1(这是设置为1的4位的补码).然后,您可以像往常一样按位或按位.

 val &= ~0xf; // Clear lower 4 bits. Note: ~0xf == 0xfffffff0
 val |= lower4Bits & 0xf; // Worth anding with the 4 bits set to 1 to make sure no
                          // other bits are set.
Run Code Online (Sandbox Code Playgroud)

  • 为什么~0xf等于0x0000000f(四个字节),为什么不是3个字节或5个字节?编译器是否根据要与的 val 的 sizeof 决定长度 4? (2认同)