1

非常に単純な問題: 整数のリストがあります。

 a = [7 8]

ここで、リスト内の各整数のハミング重み (バイナリ表現の 1 ビットの数) を含む別のリストが必要です。つまり、上記の整数リストの結果は次のようになります。

 res = [3 1]

どうすればこれをすばやく行うことができるか考えている人はいますか?

4

2 に答える 2

5

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

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

バイナリ表現に変換aし、その表現の文字数を調べて'1'、それらの数値を合計します。

于 2012-02-22T15:03:47.967 に答える
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
于 2012-06-30T00:13:42.120 に答える