C - 移位电源操作

时间:2016-03-21 11:54:01

标签: c

由于我是C的新手,我可能还不清楚如何正确使用移位运算符。 我写了这段代码:

#include <stdio.h>
#define SIZE 8

int main() {
    int a[ SIZE ] = {0};
    int i;
    int x = 1;
    int sum = 0;
    for (i = (SIZE - 1); i >= 0; i--){
        scanf("%d", &a[ i ]);
    }
    for (i = 0;i < SIZE;i++) {
        if (x & a[ i ])
            sum = sum + (i << 1);
        else
            sum = (sum + 0); 
    }
    printf ("%d\n\n", sum);
    return 0;
}

我对此代码的期望是,如果我在堆栈中输入此值:

0
0
0
0
0
0
1
1

它返回给我两个数组索引的幂的结果。 这将是索引0从一位向左移位到1而索引1从一位向左移位到2.

然后将值存储在sum变量中,一旦循环结束,printf给出总和,在这种情况下应为3。但返回的值是2。

如果我输入:

1
0
0
0
0
0
0
0

返回的值是14。

所以在我看来它只是乘以两个输入。我不明白我做错了什么。

3 个答案:

答案 0 :(得分:0)

看起来你正在改变错误的方式。您应该sum = sum + (1 << i)而不是sum = sum + (i << 1)。后者仅将索引i乘以2(即向左移1位)。

根据位域a中的第i个位置向左移1。以下代码也应简化您的代码。

#include <stdio.h>
#define SIZE 8

int main() {
    int a[ SIZE ] = {0};
    int i;
    int sum = 0;
    for (i = (SIZE - 1); i >= 0; i--){
        scanf("%d", &a[ i ]);
    }
    for (i = 0;i < SIZE;i++) {
        if (a[ i ])
            sum = sum + (1 << i);
    }
    printf ("%d\n\n", sum);
    return 0;
}

答案 1 :(得分:0)

说实话,我无法理解你的观点。你说“它返回给我两个数组索引的幂的结果。”但你也提到左移。你想要哪一个?

无论如何,下面的代码是你想要的吗?如果你说“是”,我会详细解释。

#include <stdio.h>

#define SIZE 8

int main() {
    int a[SIZE] = {0};
    int i;
    int sum = 0;
    for (i = (SIZE - 1); i >= 0; i--){
        scanf("%d", &a[i]);
    }
    for (i = 0;i < SIZE; i++) {
        if(a[i])
            sum += 1 << a[i];
    }
    printf ("%d\n\n", sum);
    return 0;
}

答案 2 :(得分:0)

我想你知道当执行num&lt;&lt; 1时,num值将加倍... 你编写的代码完全正常,但你分析错了。

在运行期间读取输入时,您正在读取最后一个元素到第一个元素。

因此,在您的输入中0 0 0 0 0 0 1 1 只有一个[0]和一个[1]是一个而所有其他的[i]都是零。

因此,在

  for (i = 0;i < SIZE;i++) {
      if (x & a[ i ])
          sum = sum + (i << 1);
      else
          sum = (sum + 0); 
  }

 only the initial i values that are 0 and 1 are left shifted whereas all the others are ignored as all other elements except a[0] and a[1] are zero.

因此,在第一次迭代中,sum = sum +(0 <&lt; 1) - &gt; sum = 0 + 0 - &gt;总和= 0

在第二次迭代中,sum = sum +(1 <&lt; 1) - &gt; sum = 0 + 2 - &gt;总和= 2

在所有其他迭代中,i值不会左移。因此,总和保持为2。 因此,你得到的答案是正确的......

不用担心,你现在是初学者......有一天你会成功的......