如何在一行代码中找出数字的最左位和最右位?

好了,我们可以遍历一个循环,通过左移找出最左边的设置位,但是如何在一行中执行此操作以使另一行不行。设置了谁的最左位/最右位?
像y = x&〜(x-1)会找到最左边的位,但是我没怎么知道?

有人可以用C++给出代码并进行解释吗?

最佳答案

在最右边,有一个众所周知的技巧。

x=x & -x

将清除x中除最左边的所有设置位。您会找到许多解释为什么这可以在SO中起作用(例如,参见this answer)

要找到其索引,除了使用编程语言的内置函数外,除了执行循环AFAIK外,别无其他方法。请注意,此循环可以展开为一个衬垫。
pos = (16*(x&0xffff0000)!=0) + (8*(x&0xff00ff00)!=0) + (4&(x&0xf0f0f0f0)!=0) + (2*(x&0x66666666)!=0)+(x&0xaaaaaaaa)!=0)

x是上一个操作的结果(即,仅设置了最右边的位),并且通过测试起作用,因为该位在上半字中,在这种情况下,位置将> 16,然后是偶数字节,偶数半字节和以此类推。

另一个解决方案是使用数学运算符log2
pos=(int)log2((double)x)

对于最左边的位AFAIK,除了通过循环外,没有其他方法可以在位级别执行此操作。但是可以使用log2()查找最左边的位。

然后,要返回仅设置此位的int,可以使用右移。
x = 1 << ((int) log2((double)x))

这将只保留x中最左边的位。

提防以前检查x是否为非null。

关于c++ - 如何在一行中找到数字的最左位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56358931/

10-12 06:18