如果它们都是0,我怎么能使用位掩码来使数字1中的所有位,如果它们都不是0,那么全部为0?
使用无符号变量:
所以,如果我有0000-0000
,我希望成为1111-1111
。
如果我有0101-0110
(或0000-0001
或1111-1111
等),我希望成为0000-0000
。
这可以不使用任何条件吗?
答案 0 :(得分: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给出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
答案 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;
}
〜结果就是你的答案。
答案 2 :(得分: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)