我正在寻找在循环中工作的算法,它将生成任何自然数n
,只使用增量并且乘以2琐事方式已知(增量数n次)但是我是寻找更快一点的东西。老实说,我甚至不知道应该怎么做。
答案 0 :(得分:3)
基本上,你要做的是从MSB开始向右移动数字位。
例如,如果您的数字是70,那么它的二进制数是0b1000110
。因此,您希望“移入”位1,0,0,0,1,1,0。
要改为零,只需将数字翻倍。要换一个,你把数字加倍,然后递增。
if (bit_to_be_shifted_in != 0)
x = (x * 2) + 1;
else
x = x * 2;
所以,如果给你一个从MSB到LSB的位数组(即从左到右),那么C代码看起来像这样:
x = 0;
for (i = 0; i < number_of_bits; i++)
{
if (bits[i] != 0)
x = x * 2 + 1;
else
x = x * 2;
}
答案 1 :(得分:0)
这样做的一种方法是倒退。如果是奇数,则减1。如果是偶数,除以2。
while(n > 0) {
n & 1 ? n &= ~1 : n >>= 1;
}