c++ - 有人可以解释这些代码行在做什么吗?
问题描述
int64_t lstbt(int64_t val){
int64_t msk = val&(val-1);
return log2(val^msk);
}
实际计算的是什么msk
,为什么我们要返回log
value xor
msk
?
解决方案
理解函数:
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
;or
var
最初是...1
, 并且var - 1
是 ....0, 在这种情况下val&(val-1)
产生...0
;.
所以在这两种情况下,都val&(val-1)
设置0
为LSB
of var
。除此之外,另一个重要的变化val&(val-1)
是将0
最右边的第一个位设置为1
.
所以让我们说 val = xxxxxxxx 1 0000 (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
,其中用 'x' 表示的位val
将与 from 完全匹配msk
;的结果 val ^ msk
将始终是一个所有位都设置为的数字,0
唯一的例外是和bit
之间不同,即最右边的位设置为of 。val
msk
1
val
因此,结果 from val ^ msk
将始终是 2 的幂(val
0 除外)。一个可以用 表示的值2^y = x
,其中y
是 中设置为 1 的最右边位的索引val
,并且x
是 的结果val^msk
。因此,log2(val^msk)
返回y
即最右边位的索引设置为 1 in val
。
推荐阅读
- c# - 如何从本地 HTML 文件获取更新的内容以显示在 UWP 应用程序的 WebView 中?
- dart - CupertinoSliverNavigationBar largeTitle 多行
- android - 如何暂时禁用屏幕上的所有触摸并再次启用它
- nginx - 使用 nginx 将 www 重定向到非 www godaddy
- ios - 让 WKWebView 覆盖整个屏幕
- django - Django - collectstatic 后出现 500 内部服务器错误
- android - Spotify 如何与 Android 上的默认时钟应用程序集成
- google-chrome - GQUIC 如何影响 WebRTC 流程?
- ios - 如何检查 SVG 文件验证?
- python - Python - 扭曲的反应器 - 从线程的角度来看 callLater 和 callFromThread 之间的区别