2

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

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

那么我怎么能只用位操作呢?

提前致谢。

4

3 回答 3

5

尝试类似:

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

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

于 2012-08-10T11:02:36.470 回答
3
val = a ^ ((a ^ b) & mask); 

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

于 2012-08-10T11:18:29.900 回答
2

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

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

波浪号~运算符产生否定掩码。将掩码中设置AND~mask位清零。b

于 2012-08-10T11:02:57.370 回答