在一行 C 中组合设置、清除和切换

Combine Set, Clear and Toggle in one line of C

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

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

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

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

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

那些都不行。如有任何建议,我们将不胜感激。

就是这样

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

你的第一次尝试是错误的,因为 x 的值没有更新,所以所有的操作都在同一个值上进行,此外,对值进行或运算并不等同于将操作结果分配给 x.

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

您的第二个解决方案因运算符优先级而失败。您可以这样修复它:

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

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

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

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