我想知道是否可以使用位操作根据位掩码合并两个位域? 例如,我有两个值,一个位掩码:
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
那么我怎样才能进行位操作?
提前致谢。
答案 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);
也有效。通常这并没有真正帮助,但在某些情况下可能会有所帮助。例如,如果a
和b
都是常量,那么它可以比普通公式更简化。