【发布时间】:2010-11-25 08:18:18
【问题描述】:
本着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;
当然我需要避免条件。到目前为止,我想出的最好的是
x -= (1|(~sgn+1))*pow2
但这涉及到我也想避免的乘法。提前致谢。
编辑:谢谢大家,
x -= (pow2^-sgn) + sgn
似乎可以解决问题!
【问题讨论】:
-
那么你应该接受答案。
-
当乘法不是问题时,我们还有:
x -= (1-2*sgn)*pow,使用映射0 -> 1和1 -> -1,等于x -> (1-2x)。 -
再一次,括号!
^的优先级低于+,所以`x -= pow2^-sgn + sgn` 是x -= pow2^(-sgn+sgn)是x -= pow2。
标签: c++ c bit-manipulation