Algorithm 使用递增和乘以2生成任意数字

Algorithm 使用递增和乘以2生成任意数字,algorithm,assembly,Algorithm,Assembly,我正在寻找一种循环运算的算法,它可以生成任何自然数n,只使用递增和2次乘法,这是一种已知的简单方法(递增数n次),但我正在寻找更快一点的方法。老实说,我甚至不知道该如何开始这个过程。基本上,您要做的是将数字的位从右移,从MSB开始 例如,如果您的数字是70,则其二进制为0b1000110。所以,你想“移入”位1,0,0,0,1,1,0 要转换为零,只需将数字加倍。若要转换为1,请将数字加倍,然后递增 if (bit_to_be_shifted_in != 0) x = (x * 2) +

我正在寻找一种循环运算的算法,它可以生成任何自然数
n
,只使用递增和2次乘法,这是一种已知的简单方法(递增数n次),但我正在寻找更快一点的方法。老实说,我甚至不知道该如何开始这个过程。

基本上,您要做的是将数字的位从右移,从MSB开始

例如,如果您的数字是70,则其二进制为
0b1000110
。所以,你想“移入”位1,0,0,0,1,1,0

要转换为零,只需将数字加倍。若要转换为1,请将数字加倍,然后递增

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;
}
x=0;
对于(i=0;i<位的个数;i++)
{
如果(位[i]!=0)
x=x*2+1;
其他的
x=x*2;
}

基本上,您要做的是将数字的位从右移,从MSB开始

例如,如果您的数字是70,则其二进制为
0b1000110
。所以,你想“移入”位1,0,0,0,1,1,0

要转换为零,只需将数字加倍。若要转换为1,请将数字加倍,然后递增

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;
}
x=0;
对于(i=0;i<位的个数;i++)
{
如果(位[i]!=0)
x=x*2+1;
其他的
x=x*2;
}

基本上,您要做的是将数字的位从右移,从MSB开始

例如,如果您的数字是70,则其二进制为
0b1000110
。所以,你想“移入”位1,0,0,0,1,1,0

要转换为零,只需将数字加倍。若要转换为1,请将数字加倍,然后递增

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;
}
x=0;
对于(i=0;i<位的个数;i++)
{
如果(位[i]!=0)
x=x*2+1;
其他的
x=x*2;
}

基本上,您要做的是将数字的位从右移,从MSB开始

例如,如果您的数字是70,则其二进制为
0b1000110
。所以,你想“移入”位1,0,0,0,1,1,0

要转换为零,只需将数字加倍。若要转换为1,请将数字加倍,然后递增

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;
}
x=0;
对于(i=0;i<位的个数;i++)
{
如果(位[i]!=0)
x=x*2+1;
其他的
x=x*2;
}

一种方法是向后走。如果是奇数,减去一。如果是偶数,除以2

while(n > 0) {
   n & 1 ? n &= ~1 : n >>= 1;
}

这样做的一个方法是倒退。如果是奇数,减去一。如果是偶数,除以2

while(n > 0) {
   n & 1 ? n &= ~1 : n >>= 1;
}

这样做的一个方法是倒退。如果是奇数,减去一。如果是偶数,除以2

while(n > 0) {
   n & 1 ? n &= ~1 : n >>= 1;
}

这样做的一个方法是倒退。如果是奇数,减去一。如果是偶数,除以2

while(n > 0) {
   n & 1 ? n &= ~1 : n >>= 1;
}


如果你想要的数字是偶数,你可以先生成它的一半,然后再生成两倍(比如,对于8,生成4,那么4*2等于8)。如果它是奇数,首先生成它的一半(剩下的1/2被删除),然后加倍并递增(对于13生成6,那么6*2+1得到13)。你能提供一些例子吗?在循环中工作假定初始值、增量和条件,在循环操作期间,您将处理一个数字,因此何时结束?您知道二进制数吗?:)是的,我知道,你可以展开答案吗?看起来@Drew已经完成了。如果你想要的数字是偶数,你可以先生成它的半个,然后再生成两个(比如,对于8,生成4,然后4*2等于8)。如果它是奇数,首先生成它的一半(剩下的1/2被删除),然后加倍并递增(对于13生成6,那么6*2+1得到13)。你能提供一些例子吗?在循环中工作假定初始值、增量和条件,在循环操作期间,您将处理一个数字,因此何时结束?您知道二进制数吗?:)是的,我知道,你可以展开答案吗?看起来@Drew已经完成了。如果你想要的数字是偶数,你可以先生成它的半个,然后再生成两个(比如,对于8,生成4,然后4*2等于8)。如果它是奇数,首先生成它的一半(剩下的1/2被删除),然后加倍并递增(对于13生成6,那么6*2+1得到13)。你能提供一些例子吗?在循环中工作假定初始值、增量和条件,在循环操作期间,您将处理一个数字,因此何时结束?您知道二进制数吗?:)是的,我知道,你可以展开答案吗?看起来@Drew已经完成了。如果你想要的数字是偶数,你可以先生成它的半个,然后再生成两个(比如,对于8,生成4,然后4*2等于8)。如果它是奇数,首先生成它的一半(剩下的1/2被删除),然后加倍并递增(对于13生成6,那么6*2+1得到13)。你能提供一些例子吗?在循环中工作假定初始值、增量和条件,在循环操作期间,您将处理一个数字,因此何时结束?您知道二进制数吗?:)是的,我知道,你能展开回答吗看起来@Drew已经做了。