使用Incrementation和mult by 2生成任意数字

时间:2015-01-13 23:43:42

标签: algorithm assembly

我正在寻找在循环中工作的算法,它将生成任何自然数n,只使用增量并且乘以2琐事方式已知(增量数n次)但是我是寻找更快一点的东西。老实说,我甚至不知道应该怎么做。

2 个答案:

答案 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;
}