如何在一行代码中找出数字的最左位和最右位?
好吧,我们可以遍历循环以通过左移找出最左边的设置位,但是如何在一行中做到这一点又使另一个不行。设置了谁的最左位/最右位? 像y = x&〜(x-1)会找到最左边的位,但是我没怎么知道?
有人可以用C ++给出代码并解释吗?
答案 0 :(得分:3)
在最右边,有一个众所周知的技巧。
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()查找最左边的位。
然后,要返回仅设置此位的整数,可以使用右移。
x = 1 << ((int) log2((double)x))
这将只保留x中最左边的位。
当心,请事先检查x是否为非null。