有人可以解释这些代码行在做什么吗?

Can someone explain what these lines of code are doing?

int64_t lstbt(int64_t val){ 
   int64_t msk = val&(val-1); 
   return log2(val^msk);
}

msk 实际计算的是什么,为什么我们要返回 log 的值 xor msk

val&(val-1) # to figure out if value is either 0 or an exact power of two.
val^msk # cuts the part of power of 2 from val
log2 # finds the index of bit which set val^msk.

所以我猜你的功能lstbt是找出val可以在2上除以提醒0的次数。

了解函数:

int64_t lstbt(int64_t val){ 
   int64_t msk = val&(val-1); 
   return log2(val^msk);
}

让我们把它分成更小的块。

首先声明 val-1,通过将 -1 添加到 val,您翻转(除其他外)最低有效位 (LSB),(即, 0变成1反之).

下一个操作 (val&(val-1)) 按位应用“与”。从 & 运算符我们知道:

1 & 1  -> 1
1 & 0  -> 0
0 & 1  -> 0
0 & 0  -> 0

所以要么

  1. val 最初是 ...0,而 val - 1 是 ..1,在这种情况下 val&(val-1) 产生 ...0;

  2. var最初是...1,而var - 1是....0,在这种情况下val&(val-1)产生...0;.

所以在这两种情况下,val&(val-1) 设置为 0 varLSB。除此之外,val&(val-1) 所做的另一个重要更改是将最右边的第一个位设置为 0 设置为 1

所以让我们假设 val = xxxxxxxx10000(它可能是 xxxxxxxxx1000 只要它显示最右边的位设置为 1),当msk=val&(val-1) 然后 msk 将是 xxxxxxxx00000

接下来,我们有val ^ msk;一个XOR位运算,我们知道:

1 ^ 1  -> 0
1 ^ 0  -> 1
0 ^ 1  -> 1
0 ^ 0  -> 0

所以因为 val 将类似于 xxxxxxxx10000 和 msk xxxxxxxx00000,其中 val 中用 'x' 表示的位将与来自 val 的位完全匹配msk; val ^ msk 的结果将始终是一个数字,所有位都设置为 0,唯一的 bit 除外,它在 valmsk 之间是不同的,即最右边的位设置为 1 of val.

因此,val ^ msk 的结果将始终是 2 的幂(除非 val 为 0)。可以用2^y = x表示的值,其中yval中设置为1的最右边位的索引,x是[=61的结果=].因此,log2(val^msk) 返回 y val.

中最右边的位设置为 1 的索引