如何在一行代码中找出数字的最左位和最右位?
好了,我们可以遍历一个循环,通过左移找出最左边的设置位,但是如何在一行中执行此操作以使另一行不行。设置了谁的最左位/最右位?
像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/