一个地址的“长度”最低有效位应与另一个地址的“长度”最低有效位进行比较。 有人可以帮助我获得同样的最佳解决方案吗?
实施例
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,则上述两个地址相同。
答案 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是八进制常量。