加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 用于计数位的高效按位运算或找到最右侧的位

发布时间:2020-12-16 10:53:00 所属栏目:百科 来源:网络整理
导读:给定unsigned int,我必须执行以下操作: 计算设置为1的位数 找到最左边1位的索引 找到最右边1位的索引 (该操作不应该是架构依赖). 我已经使用按位移位完成了这个,但我必须迭代几乎所有的位(es.32). 例如,计算1: unsigned int number= ...;while(number != 0
给定unsigned int,我必须执行以下操作:

>计算设置为1的位数
>找到最左边1位的索引
>找到最右边1位的索引

(该操作不应该是架构依赖).

我已经使用按位移位完成了这个,但我必须迭代几乎所有的位(es.32).
例如,计算1:

unsigned int number= ...;
while(number != 0){
    if ((number & 0x01) != 0)
        ++count;
    number >>=1;
}

其他操作类似.

所以我的问题是:有没有更快的方法呢?

解决方法

如果您想要最快的方式,则需要使用非便携式方法.

在Windows / MSVC:

> _BitScanForward()
> _BitScanReverse()
> __popcnt()

GCC:

> __builtin_ffs()
> __builtin_ctz()
> __builtin_clz()
> __builtin_popcount()

这些通常直接映射到本机硬件指令.所以它没有比这些快得多.

但由于它们没有C/C++功能,因此只能通过编译器内在函数访问它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读