char型のハミング重みとハミング距離を計算したい。


c++でchar型のハミング重みとハミング距離を計算したいです。  
ハミング重みとはビット列の中に含まれる1の数で、ハミング距離とは2つのビット列の異なるビットの数です。

例えば

[code]

    a = 1010
    b = 1111
    
[/code]

ならば

ハミング重みはa=2,b=4です。  
a,bのハミング距離は2です。

もし、これらは配列であれば簡単ですが、char型のまま求めることは可能でしょうか。また、もし直接できなければchar型を2進数の配列に変換することはできますでしょうか。




c 言語の機能だけで実現できます。具体的には、 bitwise 演算を用いて、 bit が立っている個数を計算します。ハミング距離を計算するには、2つの
char の xor 演算を取った結果に対して、 bit の個数を計算します。  
以下の `total_bits` の実装にはいくつも hack っぽい方法があるのですが、解りやすい実装は次です。

[code]

    #include <stdio.h>
    
    
    int total_bits(unsigned char v) {
        unsigned int c; // c accumulates the total bits set in v
    
        for (c = 0; v; v >>= 1) {
            c += v & 1;
        }
        return c;
    }
    
    
    int main() {
        char a = 0x0a;
        char b = 0x0f;
    
        printf("a: %d\n", total_bits(a));
        printf("b: %d\n", total_bits(b));
        printf("hamming(a,b): %d\n", total_bits(a ^ b));
    
    }
    
[/code]

出力

[code]

    a: 2
    b: 4
    hamming(a,b): 2
    
[/code]

* * *

参考: <http://graphics.stanford.edu/~seander/bithacks.html> の counting bitsets

より効率的な方法を知りたければ、上記のサイトを見てみると、いろいろ方法が書いて有ります。




c 言語の機能だけで実現できます。具体的には、 bitwise 演算を用いて、 bit が立っている個数を計算します。ハミング距離を計算するには、2つの
char の xor 演算を取った結果に対して、 bit の個数を計算します。  
以下の `total_bits` の実装にはいくつも hack っぽい方法があるのですが、解りやすい実装は次です。

[code]

    #include <stdio.h>
    
    
    int total_bits(unsigned char v) {
        unsigned int c; // c accumulates the total bits set in v
    
        for (c = 0; v; v >>= 1) {
            c += v & 1;
        }
        return c;
    }
    
    
    int main() {
        char a = 0x0a;
        char b = 0x0f;
    
        printf("a: %d\n", total_bits(a));
        printf("b: %d\n", total_bits(b));
        printf("hamming(a,b): %d\n", total_bits(a ^ b));
    
    }
    
[/code]

出力

[code]

    a: 2
    b: 4
    hamming(a,b): 2
    
[/code]

* * *

参考: <http://graphics.stanford.edu/~seander/bithacks.html> の counting bitsets

より効率的な方法を知りたければ、上記のサイトを見てみると、いろいろ方法が書いて有ります。

