在较低位的位中检测具有相同/匹配位模式的两个数字

时间:2012-12-06 07:38:40

标签: bit-manipulation bitwise-operators

我们有两个数字在较低的顺序中具有相同的位模式。 例如:010011 10110 和10110是两个数字,它们与较低的数字匹配。

有没有一种简单的方法可以找到它? 我有一个解决方案,移动位然后比较,有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

您可以将它们混合在一起并检查最后N个低阶位是否全为零(其中N是两个数中较小的位数)。

例如:使用您提供的样本编号01001110110和10110:

01001110110 XOR 10110 = 01001100000

请注意,结果中的最后5位都为零。

在C / C ++ / Java中,您可以使用^运算符来实现此目的,然后使用掩码提取最后N位:

int a = 0x276; // 01001110110
int b = 0x16;  //       10110

if (((a ^ b) & 0x1F) == 0) { // Mask 0x1F assumes least significant 5 bits for match
    // match!
}

如果当然,这假设您知道每个数字中的有效位数(本例中为5)。如果未指定匹配位数,则需要计算连续尾随0的数量以确定匹配的位数。在这种情况下,你可能会有其他一些技巧。

答案 1 :(得分:1)

使用&屏蔽数字:

if (number1 & 0x1f == number2 & 0x1f)