为了账号安全,请及时绑定邮箱和手机立即绑定

设置的最小有效位的位置

设置的最小有效位的位置

C++
月关宝盒 2019-07-01 20:33:50
设置的最小有效位的位置我正在寻找一种有效的方法来确定在整数中设置的最小有效位的位置,例如对于0x0FF0,它将是4。一个简单的实现是:unsigned GetLowestBitPos(unsigned value){    assert(value != 0); // handled separately    unsigned pos = 0;    while (!(value & 1))    {       value >>= 1;       ++pos;    }    return pos;}有什么办法能挤出一些循环吗?(注意:这个问题是给喜欢这类事情的人,而不是为了让人们告诉我木偶优化是邪恶的。)
查看完整描述

3 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

旋转钻头提供了一个优秀的集合,呃,比特旋转黑客,并附上性能/优化讨论。对于您的问题,我最喜欢的解决方案(来自该站点)是“乘和查找”:

unsigned int v;  // find the number of trailing zeros in 32-bit v int r;           // result goes herestatic const int MultiplyDeBruijnBitPosition[32] = {
  0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 
  31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9};r = MultiplyDeBruijnBitPosition[((uint32_t)((v & -v) * 0x077CB531U)) >> 27];

有用的参考资料:


查看完整回答
反对 回复 2019-07-01
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

为什么不使用内置的FFS?(我从Linux上抓取了一个手册页,但它比这更广泛。)

FFS(3)-Linux手册页

名字,姓名

FFS-查找一个单词中的第一个位

简介

#include <strings.h>int ffs(int i);#define _GNU_SOURCE#include <string.h>int ffsl(long int i);int ffsll(long long int i);

描述

函数返回在字I中设置的第一个(最不重要的)位的位置。最不重要的位是位置1和最重要的位置,例如32或64。函数ffsll()和ffsl()做同样的工作,但使用可能不同大小的参数。

返回值

这些函数返回第一个位集的位置,如果i中没有设置位,则返回0。

符合

4.3BSD,POSIX.1-2001。

注记

BSD系统有一个原型<string.h>.


查看完整回答
反对 回复 2019-07-01
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

有x86程序集指令(bsf)那就行了。*)

更优化?!

边注:

这个级别的优化本质上是依赖于体系结构的。今天的处理器是太复杂(在分支预测、缓存丢失、流水线方面),很难预测哪段代码在哪种体系结构上执行得更快。将操作从32减少到9或类似的事情甚至会降低某些体系结构的性能。单个体系结构上的优化代码可能会导致另一个体系结构中更糟的代码。我认为您可以为特定的CPU优化它,或者保留它的原样,让编译器来选择它认为更好的。


查看完整回答
反对 回复 2019-07-01
  • 3 回答
  • 0 关注
  • 481 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信