最优雅的方法来确定一个人被比特移动了多少



所以假设我们将1位移一些数字x;例如,在c:中

unsigned char cNum= 1, x= 6;
cNum <<= x;

cNum将等于01000000b(0x40(。

很简单。但是,如果不使用查找表或while循环,是否有一个简单的操作可以获取cNum并返回x?

AFAIK,没有可用的"简单"公式。

然而,可以计算最高有效(或最低有效(设置位的索引:

a = 000010010, a_left = 3, a_right = 1
b = 001001000, b_left = 5, b_right = 3

换档的差值为2(或-2(。

然后可以将较小者移位abs(shift)以比较该a << 2 == b。(在一些体系结构中,存在按符号值进行的移位,它在没有绝对值或检查移位需要以何种方式进行的情况下工作。(

在ARM Neon中存在用于计数MSB位的指令,而在Intel中存在从左到右扫描的指令。

log2(cNum(+1;将产生x,其中cNum!=0,至少在GNU c.中

编译器自动执行强制转换,这可能是一种糟糕的形式,但它提供了我所需要的。