我试图在一行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
那些不起作用。任何建议都将不胜感激。
答案 0 :(得分:4)
只是这个
x = (((x & 0xD5) | 0x51) ^ 0x84)
您的第一次尝试是错误的,因为x
的值未更新,因此所有操作都使用相同的值,除了oring值不等于将操作的结果分配给{{1} }。
第二个是错误的,因为或运算符优先,所以你只需要括号。
答案 1 :(得分:3)
由于运营商优先级,您的第二个解决方案失败。你可以这样修理它:
x = ((x & 0xD5) | 0x51) ^ 0x84;
但是有一个更有效的解决方案:
x = (x & (0xD5 & ~0x51)) ^ (0x84 | 0x51);
清除要清除的位和要设置的位,然后切换要切换的位和要设置的位。它编译为少一个操作,因为常量操作在编译时折叠。