【问题标题】:Can someone explain what these lines of code are doing?有人可以解释这些代码行在做什么吗?
【发布时间】:2021-04-07 15:44:17
【问题描述】:
int64_t lstbt(int64_t val){ 
   int64_t msk = val&(val-1); 
   return log2(val^msk);
}

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

【问题讨论】:

  • val&(val-1) 关闭 val 中最右边的设置位。 val^msk 生成所有位为 0 的数字,并且 1 代替 val 中最右边的设置位。 log2 给出了它的索引。

标签: c++ bit-manipulation bit bitmask


【解决方案1】:

了解功能:

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

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

首先声明val-1,通过将-1 添加到val,您翻转(以及其他)最低有效位(LSB),(ie, 0 变成@ 987654326@,反之亦然)。

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

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

要么

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

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

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

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

接下来,我们有val ^ mskXOR 位运算,我们知道:

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

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

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

【讨论】:

    【解决方案2】:
    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 的次数。

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2021-12-06
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      相关资源
      最近更新 更多