我有一个二进制数字和一个掩码。掩码是一些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
......然后就是假的。
谢谢!
答案 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