我有一个问题,我需要找到两个整数之间的匹配位数(从左到右)
输入:2 个变量 A 和 B 来存储我的十进制数
输出:A 和 B 中匹配的位数(从左侧开始)
一些例子:
A = 3 and B = 2
, A 和 B 位匹配左起 7 位
A = 3 and B = 40
, A 和 B 位匹配左起 7 位。
如何使用按位运算(AND、OR、XOR)来做到这一点?
谢谢
我有一个问题,我需要找到两个整数之间的匹配位数(从左到右)
输入:2 个变量 A 和 B 来存储我的十进制数
输出:A 和 B 中匹配的位数(从左侧开始)
一些例子:
A = 3 and B = 2
, A 和 B 位匹配左起 7 位
A = 3 and B = 40
, A 和 B 位匹配左起 7 位。
如何使用按位运算(AND、OR、XOR)来做到这一点?
谢谢
将两者异或(产生一个从左边到第一个不匹配元素全为零的数字),然后将结果右移直到等于 0。从您正在处理的整数的位长度中减去它(例如,您似乎在暗示 8 位)。
伪代码:
int matchingBits(A, B) {
result = A XOR B
int shifts = 0
while (result != 0) {
result = result >> 1 (Shift right the result by 1)
shifts++
}
return integer_bit_length - shifts
}
执行 (A XNOR B) 以查找匹配的数字:
10101010
01001011
--XNOR--
00011101
然后使用汉明算法来计数:Count number of 1's in binary representation
(顺便说一句:xnor 是 !xor)
试试这个可能会奏效
int matchingBitsCount(val1,val2)
{
int i , cnt = 0;
for(i=7;i>=0;i--)
{
if(((1<<i)&a)^((1<<i)&b))==0) //left shifted for starting from left side and then XOR
{
cnt++;
}
else
{
break;
}
}
}
如果您想检查 int,我将 val1 和 val 2 作为 char,然后只需 i=31