位计算 - 寻找整型中第一个比特1的位置

 记录《hack's delight》 中一个神奇算法。

static const int lsz64_tbl[64] = {

     0, 31,  4, 33, 60, 15, 12, 34,
    61, 25, 51, 10, 56, 20, 22, 35,
    62, 30,  3, 54, 52, 24, 42, 19,
    57, 29,  2, 44, 47, 28,  1, 36,
    63, 32, 59,  5,  6, 50, 55,  7,
    16, 53, 13, 41,  8, 43, 46, 17,
    26, 58, 49, 14, 11, 40,  9, 45,
    21, 48, 39, 23, 18, 38, 37, 27
};

//______________________________________________________________________________
/* FirstPiece():
  *
  *      Return square number (0 to 63) of the least significant set bit
  *      in bitboard 'bb'
  *
  *      source: Matt Taylor's "de Bruijn method" implementation
  *      Probably best if you don't even TRY to understand this one. I certainly don't...
  */
//______________________________________________________________________________
int FirstPiece(const BITBOARD bb) {
    const BITBOARD lsb = (bb & -bb) - 1;
    const unsigned int foldedLSB = ((unsigned int) lsb) ^ ((unsigned int)(lsb >> 32));
    return lsz64_tbl[foldedLSB * 0x78291ACF >> 26];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设给定一个长度为n的整型数组a,我们需要按照要求进行跳跃操作。 根据题目要求,第一步是从第一个位置跳到第2-n/2个位置。我们可以使用循环来实现这个跳跃过程。具体步骤如下: 1. 首先,我们需要计算出第二步的起始位置。根据题目要求,第二步的起始位置为第二个位置(即a[1])。 2. 然后,我们使用一个循环从第二个位置开始循环遍历到第n/2个位置。循环的迭代条件为i从1到n/2-1。 - 在每一次迭代,我们通过索引i找到对应的跳跃位置,即a[i+1]。 - 然后,我们执行跳跃操作,将当前位置跳跃到找到的跳跃位置a[i+1]。 - 最后,我们将索引i加一,进行下一次迭代。 总的来说,根据题目要求,第一步是从第一个位置跳跃到第二个到第n/2个位置,后面的跳跃由计算得到的索引决定。以下是一个示例的代码实现: ```python def jump(a): n = len(a) start_index = 1 # 第二步的起始位置 # 第一步跳跃 for i in range(1, n // 2): jump_index = i + 1 # 跳跃位置 current_index = start_index # 当前位置 start_index = jump_index # 更新第二步的起始位置 # 执行跳跃操作 while current_index < jump_index: current_index += a[current_index] return a # 示例用法 a = [1, 2, 3, 4, 5, 6] result = jump(a) print(result) ``` 以上代码示例,我们定义了一个`jump`函数来执行跳跃操作。将数组a作为参数传入该函数,该函数返回按要求跳跃操作后的数组结果。我们使用一个循环从第二个位置开始遍历,找到跳跃位置并执行跳跃操作。最后返回结果并打印输出。 这样,就完成了根据题目要求进行跳跃操作的代码实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值