-1

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

例子:

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,则上述两个地址相同。

4

3 回答 3

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);
}
于 2013-11-12T18:02:23.620 回答
2

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

为此,您可以从实际生成真正的掩码开始N。这

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

将创建一个掩码,其中1s 在N最不重要的二进制位置。(我不知道您使用什么类型来存储地址。那是您应该使用的类型来代替uintptr_t。)

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

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

或者

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

或者,您可以完全不使用任何掩码来解决相同的问题。如果您的地址M总共有位,那么比较可以表示为

(address1 << (M - N)) == (address2 << (M - N))
于 2013-11-12T19:34:34.433 回答
0

要将数字 4(或 00100)变成您想要的掩码,您需要

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

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

于 2013-11-12T19:36:19.470 回答