2012-02-22 4 views
1

아주 간단한 문제는 : 내가 해밍 무게를 포함 예를 들어 정수의 목록, 매트랩 정수의 목록은 무게를 해밍

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