一个很简单的问题:我有一个整数列表,例如,
a = [7 8]
现在我想要一个单独的列表,其中包含列表中每个整数的汉明权重(即二进制表示中 1 的位数)。这意味着上面整数列表的结果应如下所示:
res = [3 1]
任何人都知道我怎么能快速做到这一点?
一个很简单的问题:我有一个整数列表,例如,
a = [7 8]
现在我想要一个单独的列表,其中包含列表中每个整数的汉明权重(即二进制表示中 1 的位数)。这意味着上面整数列表的结果应如下所示:
res = [3 1]
任何人都知道我怎么能快速做到这一点?
这有点hacky,但它有效:
res = sum( dec2bin(a).' == '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