计算基数4中匹配数字的最快方法是什么?

时间:2012-02-11 21:45:15

标签: c algorithm optimization integer bit-manipulation

给定两个无符号整数,计算基数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位数。

2 个答案:

答案 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中的设置位数。这给出了不匹配的数量。

这是最有效的方法吗?