给定两个无符号整数,计算基数4表示中匹配数字的最快方法是什么?
示例1:
A = 13 =(31)在基数4
B = 15 =(33)在基数4
基数4中的匹配位数是1.
示例2:
A = 163 =(223)在基数4
B = 131 =(203),基础4
基数4中的匹配位数是2.
我猜第一步是计算两个整数的按位XOR,那么我们必须计算00对的数量?这样做最有效的方法是什么?
注意:假设A和B在基数4中具有固定的位数,恰好是16位数。
答案 0 :(得分:3)
假设,您的整数各为4字节。 32位。
更容易理解的方式:
帮助常数数组:
h[0]=3;
for (int i=1; i<7; i++){
h[i]=h[i-1]*4;
}
稍后,对于检查,如果c
是按位异或后的整数:
int count=0;
for (int i=0; i<7; i++){
if(c&h[i]==0)count++;
}
其他解决方案。显然,更快,但不太可理解:
int h[4]={1,0,0,0}
int count=0;
for (int i=0; i<15; i++){
count+=h[c&3];
c=c>>2;
}
进一步加快:
count= h[c&3] + h[(c=>>2)&3] + h[(c=>>2)&3] + h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3] + h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c=>>2)&3]+ h[(c>>2)&3];
更进一步:
int h[16]={2,1,1,1, 1,0,0,0, 1,0,0,0, 1,0,0,0};
count= h[c&15] + h[(c=>>4)&15] + h[(c=>>4)&15] + h[(c=>>4)&15] + h[(c=>>4)&15] + h[(c=>>4)&15] + h[(c=>>4)&15]+ h[(c>>4)&15];
如果你真的需要使用这么多(10 ^ 10)次的函数,计算h [256](你已经抓住了,如何),并使用:
count= h[c&255] + h[(c=>>8)&255] + h[(c=>>8)&255] + h[(c>>8)&255] ;
我认为,帮助数组h [256 * 256]也可以使用。然后
count= h[c&255] + h[(c>>16)&(256*256-1)];
2 ^ 16整数的数组将全部在处理器现金中(不过第三级)。所以,速度真的很棒。
答案 1 :(得分:0)
一种解决方案是使用Oli建议的设置位计数算法。但是为了使它适应基数4,我们可以做到例如:
d = x ^ y;
d =(d |(d>&gt; 1))&amp; 1431655765; // 1431655765 =(01010101010101010101010101010101)在基地2
然后计算d中的设置位数。这给出了不匹配的数量。
这是最有效的方法吗?