char
配列として表されるビットセット間のハミング距離を計算する必要があります。これはコア操作であるため、できるだけ高速にする必要があります。私はこのようなものを持っています:
const int N = 32; // 32 always
// returns the number of bits that are ones in a char
int countOnes_uchar8(unsigned char v);
// pa and pb point to arrays of N items
int hamming(const unsigned char *pa, const unsigned char *pb)
{
int ret = 0;
for(int i = 0; i < N; ++i, ++pa, ++pb)
{
ret += countOnes_uchar8(*pa ^ *pb);
}
return ret;
}
プロファイリングを行った後、 s を操作する方が高速であることに気付いたint
ので、次のように書きました。
const int N = 32; // 32 always
// returns the number of bits that are ones in a int of 32 bits
int countOnes_int32(unsigned int v);
// pa and pb point to arrays of N items
int hamming(const unsigned char *pa, const unsigned char *pb)
{
const unsigned int *qa = reinterpret_cast<const unsigned int*>(pa);
const unsigned int *qb = reinterpret_cast<const unsigned int*>(pb);
int ret = 0;
for(int i = 0; i < N / sizeof(unsigned int); ++i, ++qa, ++qb)
{
ret += countOnes_int32(*qa ^ *qb);
}
return ret;
}
質問
1) それはセーフからキャストさunsigned char *
れますか?unsigned int *
2) 私は 32 ビット マシンで作業していますが、コードを 64 ビット マシンで動作させたいと考えています。両方のマシンで 4 を返しますかsizeof(unsigned int)
、それとも 64 ビットのマシンでは 8 ですか?
3) sizeof(unsigned int)
64 ビット マシンで 4 が返された場合、どうすれば 64 ビット タイプを操作できlong long
ますか?