に整数のリストについては、ハミング重みは非常に簡単な問題:私は例えば、整数のリストを持って、Matlabの
a = [7 8]
今、私は別々のリストを持つようにしたい、それがハミングウェイトが含まれています(つまり、リスト内の整数のそれぞれについて、 バイナリ表現の1ビットの数)。つまり、上記の整数リストの結果は次のようになります。
res = [3 1]
誰でも私がこれをすばやく行うことができると思いますか?
に整数のリストについては、ハミング重みは非常に簡単な問題:私は例えば、整数のリストを持って、Matlabの
a = [7 8]
今、私は別々のリストを持つようにしたい、それがハミングウェイトが含まれています(つまり、リスト内の整数のそれぞれについて、 バイナリ表現の1ビットの数)。つまり、上記の整数リストの結果は次のようになります。
res = [3 1]
誰でも私がこれをすばやく行うことができると思いますか?
これは少しハックですが、それは動作します:
res = sum(dec2bin(a).' == '1');
それは、その表現の文字が'1'
あり、それらの数字を合計何を見て、バイナリ表現にa
を変換します。
#% 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