C / C ++ Bit Twiddling

时间:2010-11-25 08:18:18

标签: 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;

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

x -= (1|(~sgn+1))*pow2

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

编辑:谢谢大家,

x -= (pow2^-sgn) + sgn

似乎可以做到这一点!

5 个答案:

答案 0 :(得分:16)

我会尝试

x -= (pow2 ^ (~sgn+1)) + sgn

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

x -= (pow2 ^ -sgn) + sgn

如果sgn0~sgn+1也是0,那么pow2 ^ (~sgn+1) == pow2。如果sgn1,则(~sgn+1)0xFFFFFFFF(pow2 ^ (~sgn+1)) + sgn == -pow2

答案 1 :(得分:4)

mask = sgn - 1; // generate mask: sgn == 0 => mask = -1, sgn == 1 => mask = 0

x = x + (mask & (-pow2)) + (~mask & (pow2)); // use mask to select +/- pow2 for addition

答案 2 :(得分:2)

脱离我的头顶:

int subMask = sgn - 1;
x -= pow2 & subMask;
int addMask = -sgn;
x += pow2 & addMask;

无法保证它是否有效或是否聪明,这只是一个突然出现在我脑海中的随机想法。

编辑:让我们的可读性稍差一点(也就是说更紧凑):

x += (pow2 & -sgn) - (pow2 & (sgn-1)); 

答案 3 :(得分:1)

我会改变界面并用左移替换乘法。 (使用指数而不是pow2)

答案 4 :(得分:1)

你可以这样做(来自链接) x + =((pow2 ^ -sgn)+ sgn)