假设,您的整数每个都是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个整数的数组将全部存储在处理器缓存中(第三级缓存),因此速度非常快。