我有这个二进制表示法:
0b0110010
个
对于GCC,内置的函数__builtin_ffs
将返回1加上最低有效的1位的索引,对于我的示例,它返回2.
我正在寻找一种有效的方法来返回2个连续1位的索引,在我的例子中是5. 语言是C,我有64位数字 * 1024要判断.如果解决方案也可以覆盖N个连续比特的情况,那就太好了.
简单的解决方案是使用右移位操作迭代比特,并使用掩码,但效率不高.
我有这个二进制表示法:
0b0110010
个
对于GCC,内置的函数__builtin_ffs
将返回1加上最低有效的1位的索引,对于我的示例,它返回2.
我正在寻找一种有效的方法来返回2个连续1位的索引,在我的例子中是5. 语言是C,我有64位数字 * 1024要判断.如果解决方案也可以覆盖N个连续比特的情况,那就太好了.
简单的解决方案是使用右移位操作迭代比特,并使用掩码,但效率不高.
由于GCC已经有内置的,一种方法是将数字右移一位,与原始数字按位and
,然后将工作转发到__builtin_ffs
,即
__builtin_ffs((x >> 1) & x)
注意:这使用了编译器内部机制,并且根据定义是不可移植的.
在像x86这样的体系 struct 上,有用于位扫描(bsf
)的内置汇编指令.手写的C实现不太可能表现得比这更好.