我有这个二进制表示法: 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实现不太可能表现得比这更好.

C++相关问答推荐

CC crate 示例不会与C函数链接

ATmega328P USART发送字符重复打印

malloc实现:判断正确的分配对齐

找出文件是否包含给定的文件签名

如何将不同长度的位转换成字节数组?

标准的C17标准是用括号将参数包装在函数声明中吗

如何在IF语句中正确使用0.0

从uint8_t*转换为char*可接受

每次除以或乘以整数都会得到0.0000

在C++中父进程和子进程中的TAILQ队列同步问题

在进程之间重定向输出和输入流的问题

C11/C17标准允许编译器清除复合文字内存吗?

通过对一个大的Malloc内存进行切片来使用Malloc的内存片

Valgrind用net_pton()抱怨

如何在C宏定义中包含双引号?

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

区分MySQL C界面中的文本和BLOB字段

使用 GCC 将一个函数中初始化的 struct 体实例通过指针传递到 C 中的另一个函数会产生不同的结果

malloc:损坏的顶部大小无法找出问题

如何确定 C 程序中的可用堆内存