2016-03-21 10 views
0

私はC言語に新しいので、おそらくシフト演算子を正しく使う方法を明確にしていないでしょう。 私はこのコードを書いた:C - shift power operation

0 
0 
0 
0 
0 
0 
1 
1 

それは私には、インデックスの2の累乗の結果を返します:私はこのコードから期待何

#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が左に1ビットシフトされ、インデックス1が1ビット左にシフトされて2になります。

次に、値がsum変数に格納され、サイクルが終了すると、printfは合計この場合は3になるはずです。しかし、返される値は2です。

私が入力した場合:

1 
0 
0 
0 
0 
0 
0 
0 

返された値が14

あるので、ちょうど2つの入力を掛けるように私には思えます。私は何が間違っているのか理解していません。

+1

...あなたはnow..youがそれいつの日かになります初心者です、心配しないでください。 'このプログラムでは絶対に何もしません。 'sum'は変更されず、副作用はありません。 – Logicrat

+1

あなたは 'C'の初心者です。コードブロックをインデントします。後でそれが数行以上になると、あなた自身に感謝するでしょう。 – StoryTeller

+0

あなたがしようとしていることは本当に決まりません。 – Guiroux

答えて

0

、NUMの値が ...倍増され、あなたが書いたコードが完全に右に取り組んでいるが、あなたはそれが間違って分析しています。

実行時に入力を読み取っている間は、最後の要素から最初の要素までを読み込みます。

あなたの入力では、0 0 0 0 0 0 1 1 は[0]と[1]だけが1で、他のすべての[i]はゼロです。和、第2の反復において>和= 0

- >和= 0 + 0 - したがって、最初の反復で、合計=合計+(0 < < 1)

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. 
中のSO

、 = sum +(1 < <1) - > sum = 0 + 2 - > sum = 2

他のすべての反復では、iの値はシフトされません。したがって、合計は2のままです。 あなたが得た答えは正しいものです....

`他の合計は=(合計+ 0)

0

あなたは間違った方向にシフトしているようです。 sum = sum + (i << 1)ではなくsum = sum + (1 << i)を実行する必要があります。後者は、インデックス「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; 
} 
0

実際に言うと、私はあなたのポイントを得ることができません。あなたは「アレイのインデックスの2つのパワーの結果を私に返します」と言った。しかし、左シフトについても言及しました。あなたはどれが欲しいですか?

とにかく、次のコードは何ですか? 「はい」と言えば、詳しく説明します。私はあなたがNUM < < 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 += 1 << a[i]; 
    } 
    printf ("%d\n\n", sum); 
    return 0; 
}