使用位掩码将 0 设置为 1,其他所有设置为 0

问题描述 投票:0回答:4

如何使用位掩码使数字中的所有位如果全为 0 则为 1,如果不是则全为 0?

使用无符号变量:

所以,如果我有

0000-0000
,我希望它变成
1111-1111
。 如果我有
0101-0110
(或
0000-0001
,或
1111-1111
等),我希望它变成
0000-0000

这可以在不使用任何条件的情况下完成吗?

unsigned bitmask
4个回答
3
投票

当然,这是可能的:

int y = 0xff;
y = ~(y & 1 | y>>1 & 1 | y>>2 & 1 | ...) - 1

但是除非这是一项学术练习,否则你真的不应该这样做。如果您关心性能,

y = y != 0
几乎肯定更快。

说明:

y & 1
取数字的第一位。
y >> k
将数字右移
k
位,使我们能够得到
y >> k & 1
位。我们只需将它们
|
组合在一起,如果有任何位被设置,则结果为 1;如果没有,则结果为零。如果有任何位被设置,则减 1 得到 0,如果没有设置,则得到 -1。 -1 的二进制表示为
1111...

换档:

1010 - y
1010 - y >> 0
 101 - y >> 1
  10 - y >> 2
   1 - y >> 3

取第一位:

   0 - y >> 0 & 1
   1 - y >> 1 & 1
   0 - y >> 3 & 1
   1 - y >> 4 & 1

或者他们:

   1 - 0 | 1 | 0 | 1

否定:

0000 - 1-1

2
投票

可能不是一种有效的方式。

如果你真的想要,也许可以:

int mask = 0;
int result = 0;


for(int i = 0; i < sizeof(number) * 8; i++)
{
    mask |= number & 1 << i;
}


for(int i = 0; i < sizeof(number) * 8; i++)
{
    result |= mask & 1 << i;
}

~结果就是你的答案。


0
投票

这个怎么样:

def check_for_zero(value):
    # Same as "if value == 0: return 0; else: return 1"
    # value must be an 8-bit number.

    # Need to check all 8 bits of value.  But we can compress it...
    x = value | (value >> 4)
    # Now just need to check the low 4 bits of x.  Compress again...
    x = x | (x >> 2)
    # Now just need to check the low 2 bits of x.  Compress again...
    x = x | (x >> 1)
    # Now just need to check the low 1 bit of x.  Success!
    return x & 1

def expand_to_8bit(bit):
    # Same as "if bit == 0: return 0; else: return 255"
    # Must pass bit == 0 or bit == 1

    # bit is a 1-bit value.  Expand it...
    x = bit | (bit << 1)
    # x is a 2-bit value.  Expand it...
    x = x | (x << 2)
    # x is a 4-bit value.  Expand it...
    x = x | (x << 4)
    # x is a 8-bit value.  Done!
    return x

def foo(value):
    x = check_for_zero(value)
    x = x ^ 1  # Flips the bit
    return expand_to_8bit(x)

0
投票

您可以按如下方式实现。

int zeroProcedure(int i) {
  int check = !(i);
  //1 if all are 0, else 0
  check = ~check;
  //1..10 if all are 0, else all 1s.
  check += 1;
  //1...1 if all are 0, else 0.
  return check;
}

或者简单地说:

int zeroProcedure(int i) {
  return (~(!i))+1;
}
© www.soinside.com 2019 - 2024. All rights reserved.