按位运算以比较两个比特流的长度子集

时间:2013-11-12 17:56:40

标签: c bit-manipulation

一个地址的“长度”最低有效位应与另一个地址的“长度”最低有效位进行比较。 有人可以帮助我获得同样的最佳解决方案吗?

实施例

address1 = 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1
address2 = 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 1 0 0 1

如果比较位为00100,则上述两个地址相同。

3 个答案:

答案 0 :(得分:2)

正如@AndreyT所写,你真的没有描述面具。

试着猜出你真正的意思,这是我最好的尝试:
(假设您的int-size是32位。您可以转换为sizeof()或使用64)
(未经测试,但评论相当好,因此您可以自行测试并修复)

void Compare(int addrA, int addrB, int nBits)
{
    // This is all 1s in binary.
    unsigned int mask = 0xFFFFFFFF;  

    mask = mask >> (32-nBits);
    // Example: if nBits = 4
    // then 32-4 = 28 and 
    // Mask == [1111] >> 28 == 28-zeros... followed by 4 Ones

    if ((addrA & mask) == (addrB & mask))
    {
        printf("Same\n");
    } else
    {
        printf("Not the same\n");
    }
}

示例通话

int main(void)
{
   int address1 = 0x2A09;  // 00000000 0010 1010 0000 1001
   int address2 = 0x2A19;  // 00000000 0010 1010 0001 1001

   Compare(address1, address2, 4);
}

答案 1 :(得分:2)

显然,您想要比较N最低有效位。在这种情况下,您的N不是面具。 “面具”是一个具有非常特定含义的既定术语。你的N不是面具。它只是你需要比较的位数。

要实现这一目标,您可以从实际生成N的真实面具开始。此

uintptr_t mask = 1;
mask = (mask << N) - 1;

将创建一个在1最低有效二进制位置N s的掩码。 (我不知道你用什么类型来存储你的地址。这是你应该使用的类型来代替uintptr_t。)

然后您可以使用该掩码来比较您的地址

(address1 & mask) == (address2 & mask)

((address1 ^ address2) & mask) == 0

或者,您可以在不使用任何蒙版的情况下解决相同的问题。如果您的地址总共有M位,那么比较可以表示为

(address1 << (M - N)) == (address2 << (M - N))

答案 2 :(得分:0)

将数字4(或00100)变成你想要的面具,你需要

#define MASK(n)     ((1 << (n)) - 1)

另外,如果你要引用整数的二进制表示,在C中使用0b100,那么我们知道你的意思是4. 00100是八进制常量。