2012-02-22 6 views
1

に整数のリストについては、ハミング重みは非常に簡単な問題:私は例えば、整数のリストを持って、Matlabの

a = [7 8] 

今、私は別々のリストを持つようにしたい、それがハミングウェイトが含まれています(つまり、リスト内の整数のそれぞれについて、 バイナリ表現の1ビットの数)。つまり、上記の整数リストの結果は次のようになります。

res = [3 1] 

誰でも私がこれをすばやく行うことができると思いますか?

答えて

5

これは少しハックですが、それは動作します:

res = sum(dec2bin(a).' == '1'); 

それは、その表現の文字が'1'あり、それらの数字を合計何を見て、バイナリ表現にaを変換します。

1
#% Quickly for a few or quickly for millions? 
#% A quick method for a 32 bit int requires a 16 bit look-up table 
#% Ideally the table is created once and passed to the function for usage 
#% vectorized 
vt=randi(2^32,[4096*4096,1])-1; #% input vector vt 

num_ones=uint8(zeros(65536,1)); 
for i=0:65535 
num_ones(i+1)=length(find(bitget(i, 1:32))) ; 
end % 0.43 sec to create table 

v=num_ones(mod(vt,65536)+1)+num_ones(floor(vt/65536)+1); #% 0.85 sec 
% dec2bin is 1000 times slower