5

我有一个作业要求仅使用这些运算符执行许多功能:

!~ & ^ | + << >>

在某些问题中,如果某个整数 x 包含任何 1,则使其全为 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。

编辑:如果语句不是一个选项

4

3 回答 3

6

假设 2 的补码:

int mask = !x + ~0;

!任何非零值映射到和0,然后我们将( ) 分别添加到 get和。01~0-1-10

于 2013-02-01T22:44:54.667 回答
3

怎么样:

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

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

于 2013-02-01T22:44:31.437 回答
2

我认为这是一个可行的方法(假设二进制补码算术):

x = ~!!x + 1;

我是怎么到那里的?

首先,!!x将任何非零值变为 1,并且 0 保持 0。然后,使用 2 的补码等效 negation -x = ~x + 1,presto!

于 2013-02-01T22:50:15.617 回答