查找给定二进制数字设置为0的第N个数字

时间:2018-06-21 07:56:12

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

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

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

000,001,100,101

2 个答案:

答案 0 :(得分:3)

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

例如:

 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 & Mask)选择正确到目标位的位(将其他位清零)
表达式(NN & NotMask) << 1选择左位,然后将其移位以为零目标位腾出空间

答案 1 :(得分:1)

当我们向上移动自然数序列时,目标位在未设置target**2次和设置target**2次之间振荡。因此,我们可以直接计算目标位未设置的第n个数字。

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))