我如何比较 2 个值 A 和 B,如果在 A 中设置的任何位也在 B 中设置,我得到 0,如果在 A 中设置的所有位在 B 中都是 CLEAR,我得到 1 (或其他一些非零值)?
例子,fn(1010, 1111) = 0; fn(1110, 0001) = 1; fn(0101, 1010) = 1; fn(0010, 1010) = 0 等等
编辑: fn(0000, 0000) 可以产生 0 或 1,因为这是一种边缘情况。 1 个首选,0 个可接受。
是否有某种 AND、OR、XOR、NOT 操作的组合可以满足我的需求?
这两个条件其实是等价的:
如果
A
中的任何1位对应于B
中的1位,则按位AND
将不等于零:
((A & B) == 0)
如果
A
中的所有1位都对应于B
中的0位,则A和位反转B之间的按位与将等于A:
((A & ~B) == A)
以下测试表明,对于所有 256 个输入组合,两个表达式都产生相同的值:
for (int A = 0; A < 16; A++)
for (int B = 0; B < 16; B++)
{
bool b1 = ((A & B) == 0);
bool b2 = ((A & ~B) == A);
if (b1 != b2)
{
Console.WriteLine($"{bits4(A)} {bits4(B)} {b1} {b2}");
}
}
string bits4(int a)
{
string s = "";
for (int i = 0; i < 4; i++)
{
s = s + (((a >> i) % 2 == 1) ? "1" : "0");
}
return s;
}