あなたのintはそれぞれ4バイトです。 32ビット。
より理解しやすい方法:
ヘルプ定数配列:
h[0]=3;
for (int i=1; i<7; i++){
h[i]=h[i-1]*4;
}
その後、検査のために、c
は、ビット単位のXOR後の整数の場合:
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;
}
さらにqickening:
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(非常に多くの機能を使用する必要がある場合)times、count 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 intの配列はすべてプロセッサの現金(3番目のレベル)になります。だから、スピードは本当に素晴らしいでしょう。
必須のリンク:http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive。 –
@OliCharlesworth:リンクをありがとう。これをベース4のケースにどのように適応させることができますか? – mghandi
163 =ベース4の2203、ベース4の131 = 2003。興味があれば、私はCコードを投稿することができます:-) – bitfox