计算整数中的设置位数?

时间:2013-01-08 18:14:38

标签: matlab binary lookup-tables

我正在尝试使用x * x-1来检查整数是否为2的幂,然后计算它。

long count_bits(long n) {
unsigned int c;
for c = 0:n
n = n * (n - 1);  %Determines if an integer is a power of two!
c=c+1;
end

disp(c);

在这里找到了答案:Calculating Hamming weight efficiently in matlab

1 个答案:

答案 0 :(得分:3)

使用bitget

% generate a random int number
>> n = uint32( randi( intmax('uint32'), 1, 1 ) )

n = 

   3771981510

>> count = sum(bitget(n,1:32))

count = 

   18

或者,如果您关注性能,可以使用查找表(LUT)来计算位数:

构造8位整数的LUT(仅256个条目):

function lut = countBitsLUT()
for ii = 0:255
    lut(ii+1) = sum(bitget(uint8(ii),1:8));
end

你只需要构建一次LUT。

获得LUT后,您可以使用以下方式计算位数:

count = lut( bitand(n,255)+1 ) + ...      % how many set bits in first byte
        lut( bitand( bitshift(n,-8), 255 ) + 1 ) + ... % how many set bits in second byte
        lut( bitand( bitshift(n,-16), 255 ) + 1 ) + ... % how many set bits in third byte
        lut( bitand( bitshift(n,-24), 255 ) + 1 ); % how many set bits in fourth byte

我也做了一个小的“基准”:

lutCount = @( n ) lut( bitand(n,255)+1 ) + ...      % how many set bits in first byte
        lut( bitand( bitshift(n,-8), 255 ) + 1 ) + ... % how many set bits in second byte
        lut( bitand( bitshift(n,-16), 255 ) + 1 ) + ... % how many set bits in third byte
        lut( bitand( bitshift(n,-24), 255 ) + 1 ); % how many set bits in fourth byte

t = [ 0 0 ];
for ii=1:1000
    n = uint32( randi( intmax('uint32'), 1, 1 ) );
    tic;
    c1 = sum(bitget(n,1:32));
    t(1) = t(1) + toc;
    tic;
    c2 = lutCount( n );
    t(2) = t(2) + toc;
    assert( c1 == c2 );
end

运行时间是:

t = [0.0115    0.0053]

也就是说,LUT的速度是sum的{​​{1}}的两倍。