Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找位掩码中最低0位的最快方法是什么?_C++_Assembly_Bit Manipulation - Fatal编程技术网

C++ 查找位掩码中最低0位的最快方法是什么?

C++ 查找位掩码中最低0位的最快方法是什么?,c++,assembly,bit-manipulation,C++,Assembly,Bit Manipulation,假设我们有一个位掩码,比如说64位。查找最低0位的简单方法是使用掩码0x0001执行逻辑位&操作,并在结果为1时将上面的掩码向左移动 这是位数O(n)的线性时间复杂度。我想知道您是否可以实现比原始迭代方法更快的执行,或者这是否是理论上的最佳方法。将其反转,然后使用计数尾随零指令。e、 GNU C中的内置ctz(~x)。大多数体系结构都有ctz指令,但ISO C不可移植地公开它。数据有什么特殊之处吗?例如,最低的0是否可能是MSB或更可能是LSB?如果您不想接受Peters的建议和/或必须自己实现

假设我们有一个位掩码,比如说64位。查找最低0位的简单方法是使用掩码
0x0001
执行逻辑位&操作,并在结果为1时将上面的掩码向左移动


这是位数O(n)的线性时间复杂度。我想知道您是否可以实现比原始迭代方法更快的执行,或者这是否是理论上的最佳方法。

将其反转,然后使用计数尾随零指令。e、 GNU C中的内置ctz(~x)。大多数体系结构都有ctz指令,但ISO C不可移植地公开它。数据有什么特殊之处吗?例如,最低的0是否可能是MSB或更可能是LSB?如果您不想接受Peters的建议和/或必须自己实现,请考虑将较大的部分(8位、16位、32位)与所有部分进行比较,这将使您获得O(ln n)。我在各种编译器上找到了一些关于高效CTZ的问题和答案。一旦反转位图,这将是重复的。还有POSIX <代码> FFS>代码>,好的C++实现将嵌入到CTZ指令中。链接DUP上的一些答案避免使用内部变量,因此您可以使用它们,正如@Yunnosch所建议的,选择可能取决于低位8中是否可能有零位或其他内容。在x86上,
not
/
tzcnt
bsf
无疑是使用内部函数的最佳选择。@PeterCordes我有一个小问题。我保证有0作为可能的输入以及64位,文档中说这会导致未定义的行为如果你想让你的问题具体到你优化的目的,而不是一般性的,可能会回答它。实际上,它肯定是重复的,因为问题中没有硬件/目标详细信息。您标记了程序集,但没有标记什么体系结构。我还是不知道你是在x86、PowerPC、MIPS64、AARC64还是什么。