C/C++ Bit Twiddling

fs.*_*fs. 15 c c++ bit-manipulation

graphics.stanford.edu/~seander/bithacks.html的精神,我需要解决以下问题:

int x; 
int pow2; // always a positive power of 2
int sgn;  // always either 0 or 1
// ...
// ...
if(sgn == 0)
    x -= pow2;
else
    x += pow2;
Run Code Online (Sandbox Code Playgroud)

当然我需要避免有条件的.到目前为止,我想到的最好的是

x -= (1|(~sgn+1))*pow2
Run Code Online (Sandbox Code Playgroud)

但这涉及乘法,我也想避免.提前致谢.

编辑:谢谢大家,

x -= (pow2^-sgn) + sgn
Run Code Online (Sandbox Code Playgroud)

似乎做的伎俩!

Sve*_*ach 16

我会尝试

x -= (pow2 ^ (~sgn+1)) + sgn
Run Code Online (Sandbox Code Playgroud)

或者,正如李杰在评论中所建议的那样

x -= (pow2 ^ -sgn) + sgn
Run Code Online (Sandbox Code Playgroud)

如果sgn0,~sgn+1也是0如此pow2 ^ (~sgn+1) == pow2.如果sgn1,(~sgn+1)0xFFFFFFFF,和(pow2 ^ (~sgn+1)) + sgn == -pow2.

  • 你可以将`~sgn + 1`改为`-sgn`. (4认同)
  • 哦,是的.呃`^`的优先级低于`+`,所以我建议使用括号. (2认同)