如何检查是否设置了给定的一组位

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

我如何比较 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 操作的组合可以满足我的需求?

binary bit-manipulation bitwise-operators
1个回答
1
投票

这两个条件其实是等价的:

如果

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;
    }

© www.soinside.com 2019 - 2024. All rights reserved.