如何在一行中找到数字的最左位

时间:2019-05-29 10:56:00

标签: c++ bit

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

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

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

1 个答案:

答案 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。