根据位掩码合并两个位域

时间:2012-08-10 10:59:58

标签: c bit-manipulation ansi bitmask

我想知道是否可以使用位操作根据位掩码合并两个位域? 例如,我有两个值,一个位掩码:

char mask = 0x29; // 0010 1001
char a = 0x9;     // 0000 1001 original value
char b = 0xE8;    // 1110 1000 modified value

我想根据位掩码将b中的位设置为a的值。只有3位会受到影响。

char val = 0xC9;  // 1100 1001 value

那么我怎样才能进行位操作?

提前致谢。

3 个答案:

答案 0 :(得分:5)

尝试类似:

b &= ~mask;       /* Clear bits set in mask. */
b |= (mask & a);  /* Add bits set both in a and in mask. */

此外,您可能希望使用unsigned类型而不是不确定的char

答案 1 :(得分:2)

首先,从b清除掩码中 set 的位。然后,从a中清除掩码中未设置的位。最后,OR两个结果一起:

b = (b & ~mask) | (a & mask);

波形符~运算符生成否定掩码。 AND使用~mask将掩码中设置的b位置零。

答案 2 :(得分:2)

val = a ^ ((a ^ b) & mask); 

也有效。通常这并没有真正帮助,但在某些情况下可能会有所帮助。例如,如果ab都是常量,那么它可以比普通公式更简化。