【问题标题】:Finding the Nth number where a given binary digit is set to 0查找给定二进制数字设置为 0 的第 N 个数字
【发布时间】:2018-06-21 07:56:11
【问题描述】:

我正在寻找一种算法,它给定一个目标,返回该目标位为 0 的第 N 个数字。

例如对于n={0,1,2,3}target=1的输入, 输出将是(二进制)

000,001,100,101

【问题讨论】:

  • 如果性能不是问题,对于n 中的每个N,您检查目标位,直到 N 为 0(仅在目标位为 0 时递减)此时将是第 N 个数字。您可以存储中间结果,并在后续遍历中使用这些结果。

标签: algorithm bitwise-operators bit bit-shift bits


【解决方案1】:

只需将值N-1(如果枚举从1开始)写入二进制,然后在需要的位置(target)插入0

例如:

 for N=3 and target=1 
 N-1 = 10bin
 inserting 0 in 1-th position gives 
 R = 100b = 4dec

位操作:

 NN = N- 1
 Mask = (1 << target) - 1   //like 00000111 for target=3
 NotMask = ~ Mask           //like 11111000 for target=3 
 R = (NN & Mask) | ((NN & NotMask) << 1)

表达式(NN &amp; Mask) 选择目标位右侧的位(将其他位归零)
表达式(NN &amp; NotMask) &lt;&lt; 1 选择左位,然后移动它们以释放零目标位的位置

【讨论】:

    【解决方案2】:

    随着我们向上移动自然数序列,目标位在未设置 target**2 次和设置 target**2 次之间振荡。所以我们可以直接计算出目标位未设置的nth个数。

    JavaScript 代码:

    function f(n, target){
        let block = 1 << target
        
        if (n < block)
          return n
          
        let index_in_block = n % block;
        let num_set_blocks = (n - index_in_block) / block
          
        return 2 * num_set_blocks * block + index_in_block
    }
    
    for (let i=0; i<10; i++)
      console.log(i, f(i, 1))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多