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

How to find the leftmost bit of an number in one line

本文关键字:数字 左边 一行      更新时间:2023-10-16

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

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

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

对于最右边的一点,有一个众所周知的技巧。

x=x & -x

将清除 x 中的所有设置位,除了最右边的位。你会发现很多解释为什么这在SO中有效(例如参见这个答案)

要找到它的索引,除了使用内置的编程语言之外,除了做一个循环 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 是否为非空。