一个地址的“长度”最低有效位应与另一个地址的“长度”最低有效位进行比较。有人可以帮助我获得相同的最佳解决方案吗?
例子:
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,则上述两个地址相同。
一个地址的“长度”最低有效位应与另一个地址的“长度”最低有效位进行比较。有人可以帮助我获得相同的最佳解决方案吗?
例子:
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,则上述两个地址相同。
正如@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);
}
显然,您想比较N
最低有效位。在那种情况下,你N
不是面具。“面具”是一个具有非常特定含义的既定术语。你N
的不是面具。这只是您必须比较的位数。
为此,您可以从实际生成真正的掩码开始N
。这
uintptr_t mask = 1;
mask = (mask << N) - 1;
将创建一个掩码,其中1
s 在N
最不重要的二进制位置。(我不知道您使用什么类型来存储地址。那是您应该使用的类型来代替uintptr_t
。)
然后您可以使用该掩码来比较您的地址
(address1 & mask) == (address2 & mask)
或者
((address1 ^ address2) & mask) == 0
或者,您可以完全不使用任何掩码来解决相同的问题。如果您的地址M
总共有位,那么比较可以表示为
(address1 << (M - N)) == (address2 << (M - N))
要将数字 4(或 00100)变成您想要的掩码,您需要
#define MASK(n) ((1 << (n)) - 1)
此外,如果您要引用整数的二进制表示,在 C 中使用 0b100,那么我们知道您的意思是 4。00100 是八进制常数。