弄清楚一个数字是全1还是全0

时间:2014-02-03 05:19:38

标签: bit-manipulation

我有一个二进制数字和一个掩码。掩码是一些1,后跟全0(即11111100000)。我需要弄清楚与掩码中的1位相对应的第一个数字的数字是全1还是全0,我想这样做而不做任何分支,并尽可能少的指令。此外,由于语言限制(我不是用C语言编写),我不能将布尔值视为数字,因此(i&mask) == 0 | (i&mask)^mask == 0将不起作用。

例如,如果我有:

i =    0b11110001
mask = 0b11100000

......那是真的。如果我有:

i =    0b00000001
mask = 0b11110000

......那是真的。但如果我有:

i =    0b11011001
mask = 0b11110000

......然后就是假的。

谢谢!

1 个答案:

答案 0 :(得分:2)

假设我现在已经明确了所有要求:

如上所述,给定一个数字x和一个掩码m,我们知道:

x & m == 0

if(且仅当)x的所有相关位为0且

(x & m) ^ m == 0

if(且仅当)x的所有相关位均为1。

显然,你不想要

(x & m == 0) || ((x & m) ^ m == 0)

因为那可能太慢了。但是,我们可以使用简单的数学技巧

a * b == 0 if (and only if) a == 0 || b == 0

也就是说,您的代码可能是

y = x & m
result = (y * (y ^ m)) == 0