有人可以解释这些代码行在做什么吗?
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
所以要么
val
最初是 ...0
,而 val - 1
是 ..1,在这种情况下 val&(val-1)
产生 ...0
;
或var
最初是...1
,而var - 1
是....0,在这种情况下val&(val-1)
产生...0
;.
所以在这两种情况下,val&(val-1)
设置为 0
var
的 LSB
。除此之外,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
除外,它在 val
和 msk
之间是不同的,即最右边的位设置为 1
of val
.
因此,val ^ msk
的结果将始终是 2 的幂(除非 val
为 0)。可以用2^y = x
表示的值,其中y
是val
中设置为1的最右边位的索引,x
是[=61的结果=].因此,log2(val^msk)
返回 y
即 在 val
.
中最右边的位设置为 1 的索引
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
所以要么
val
最初是...0
,而val - 1
是 ..1,在这种情况下val&(val-1)
产生...0
;或
var
最初是...1
,而var - 1
是....0,在这种情况下val&(val-1)
产生...0
;.
所以在这两种情况下,val&(val-1)
设置为 0
var
的 LSB
。除此之外,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
除外,它在 val
和 msk
之间是不同的,即最右边的位设置为 1
of val
.
因此,val ^ msk
的结果将始终是 2 的幂(除非 val
为 0)。可以用2^y = x
表示的值,其中y
是val
中设置为1的最右边位的索引,x
是[=61的结果=].因此,log2(val^msk)
返回 y
即 在 val
.