一尘不染

获取尾随的1位数

algorithm

我可以执行任何有效的按位运算来获取整数结尾的设置位数吗?例如11 10 = 1011 2将是两个尾随的1位。8 10 = 1000 2将是0后1位。

有比线性搜索更好的算法吗?我正在实现一个随机跳过列表,并在插入元素时使用随机数来确定元素的最大级别。我正在用C ++处理32位整数。

编辑: 汇编程序是不可能的,我对纯C ++解决方案感兴趣。


阅读 203

收藏
2020-07-28

共1个答案

一尘不染

从伊格纳西奥·巴斯克斯(Ignacio Vazquez-Abrams)那里得到答案,并用计数而不是表格来完成:

b =〜i&(i + 1); //这在尾随的1的左侧给出1
b--; //这使我们只需要计算尾随的1
b =(b&0x55555555)+((b >> 1)&0x55555555); // 1位数字的2位和
b =(b&0x33333333)+((b >> 2)&0x33333333); // 2位数字的4位和
b =(b&0x0f0f0f0f)+((b >> 4)&0x0f0f0f0f); // 8位和4位数字
b =(b&0x00ff00ff)+((b >> 8)&0x00ff00ff); // 8位数字的16位和
b =(b&0x0000ffff)+((b >> 16)&0x0000ffff); // 16位数字的总和

b的末尾将包含1的计数(掩码,加法和移位计数1)。除非我当然喜欢。使用前进行测试。

2020-07-28