有效地创建一个具有1全1但一个为0的int保持为0的int

时间:2013-02-01 22:41:48

标签: c bitwise-operators

我的作业要求只使用这些运算符来执行许多功能:

! 〜& ^ | +<< >>

在一些问题中,如果它包含任何1,则使一些整数x变为全1,但如果它为0则保持为0是有用的。我这样做的原因是我可以像这样返回y或z:

// One of the two conditional values is now 0
int conditionalA = mask&y;
int conditionalB = ~mask&z;

// One of the values is combined with 0 using |
int out = conditionalA|conditionalB;

return out;

我做了这样的面具:

// Make any x other than 0 all 1s
int mask = x;
mask |= mask>>1;
mask |= mask>>2;
mask |= mask>>4;
mask |= mask>>8;
mask |= mask>>16;

mask |= mask<<1;
mask |= mask<<2;
mask |= mask<<4;
mask |= mask<<8;
mask |= mask<<16;

必须有一个更好的方法来制作掩码全1或0但我想不出更有效的解决方案。同样,如果x为0,则0保持为0非常重要。

编辑:如果语句不是选项

3 个答案:

答案 0 :(得分:6)

假设2的补充:

int mask = !x + ~0;

!将任何非零值映射到00映射到1,然后我们添加~0-1)来获取{分别为{1}}和-1

答案 1 :(得分:3)

怎么样:

x = (x | -x) >> 31; // Note this is implementation specific.

好的,我正在使用-这是不允许的,所以这不是正确的答案。我会把它留在这里作为一种新奇。

答案 2 :(得分:2)

我认为这是一个有效的工作(假设是二进制补码):

x = ~!!x + 1;

我是如何到达那里的?

首先,!!x将任何非零值变为1,0保持为0.然后,使用2的补码等价来进行否定-x = ~x + 1,presto!