计算整数中设置的位数?

Posted

技术标签:

【中文标题】计算整数中设置的位数?【英文标题】:Counting the number of set bits in an integer? 【发布时间】:2013-01-08 18:14:38 【问题描述】:

我正在尝试使用 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

【问题讨论】:

问题可能是我怎样才能混合 C 和 matlab 代码并让它工作...... 您的问题到底是什么?您是否要查看特定数字是否为 2 的幂?你想混合使用 Matlab 和 C 代码吗?你是@aka.nice 还是@Supa? @slayton 我不是 Supra,也许我应该使用引号“我怎么能……”。我的 cmets 只是对提议的一段代码的观察......理解讽刺可能是一个很好的工具,但一旦解释它就会崩溃。 【参考方案1】:

使用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 的两倍,是 bitget 的两倍。

【讨论】:

以上是关于计算整数中设置的位数?的主要内容,如果未能解决你的问题,请参考以下文章

程序集 x86:如何计算 32 位长整数中的设置位数

获取指定时区的日期时间,与计算机中设置的日期时间无关

如何为代码中设置的参数设置布局单位?

如何根据文本字段 Material UI 中设置的值将对象设置为状态

是否可以通过 JavaScript 中的浏览器确定操作系统中设置的用户区域设置的**国家**?

获取 Vim 中设置的当前值