本着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
似乎可以做到这一点!
答案 0 :(得分:16)
我会尝试
x -= (pow2 ^ (~sgn+1)) + sgn
或者,正如李杰在评论中所建议的那样
x -= (pow2 ^ -sgn) + sgn
如果sgn
是0
,~sgn+1
也是0
,那么pow2 ^ (~sgn+1) == pow2
。如果sgn
为1
,则(~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)