我正在寻找一种给定目标的算法,该目标位的第N个数字将返回0。
例如,对于n={0,1,2,3}
和target=1
的输入,
输出为(二进制)
000,001,100,101
答案 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))