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

cod*_*001 1 bit-manipulation bitwise-operators

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

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

sco*_*awg 5

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

例如:使用您给出的样本编号01001110110和10110:

01001110110 XOR 10110 = 01001100000
Run Code Online (Sandbox Code Playgroud)

请注意,结果中的最后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!
}
Run Code Online (Sandbox Code Playgroud)

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