将Set,Clear和Toggle组合在一行C中

时间:2016-01-24 19:47:50

标签: c bit-manipulation operation

我试图在一行C中组合三位操作。对于一个8位字符,我必须设置位2,4,6;清除位1,3,7和切换位0和5都在C的一个行代码中。我可以在三行中完成这些但我不能将它们组合起来。以下是我到目前为止所做的事情:

x= x & 0xD5;
x = x | 0x51;
x = x ^ 0x84;

他们给出了给定x值的正确答案。但我试过了

x = (x & 0xD5) | (x | 0x51) | (x ^ 0x84)

x = x & 0xD5 | 0x51  ^ 0x84

那些不起作用。任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:4)

只是这个

x = (((x & 0xD5) | 0x51) ^ 0x84)

您的第一次尝试是错误的,因为x的值未更新,因此所有操作都使用相同的值,除了oring值不等于将操作的结果分配给{{1} }。

第二个是错误的,因为或运算符优先,所以你只需要括号。

答案 1 :(得分:3)

由于运营商优先级,您的第二个解决方案失败。你可以这样修理它:

x = ((x & 0xD5) | 0x51) ^ 0x84;

但是有一个更有效的解决方案:

x = (x & (0xD5 & ~0x51)) ^ (0x84 | 0x51);

清除要清除的位和要设置的位,然后切换要切换的位和要设置的位。它编译为少一个操作,因为常量操作在编译时折叠。