0
#include <stdio.h>

#define NUMVALS 6
#define SIZE 5
#define MAX 31

int main () {

   int vals = 0;

   short curVal, idx = 0;


   for(; idx < NUMVALS; ++idx) {
      scanf("%d", &curVal);

      vals = (vals << SIZE) | curVal;
   }

   printf("%d", vals | curVal);

   return 0;
}

これは私が取り組んでいるコードです。それぞれ 0 から 31 の範囲の 6 つの整数を格納することになっているため、それぞれに 5 ビットのスペースが割り当てられます。何らかの理由で機能していません。ループ内で vals に代入すると、読み込まれた現在の値のみが vals に格納されているようです。何が問題なのか分かりますか?

4

3 に答える 3

4

中途半端なコンパイラは次のことを教えてくれます:

warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘short int *’
     scanf("%d", &curVal);

%hdをスキャンするために使用するshortか、(この場合はより良い) 変数を に変更する必要がありますint

GCC を使用している場合は-Wall -Wextra -Werror、コンパイル コマンドに追加します。それはあなたのためにこれを捕まえたでしょう。

于 2015-01-23T08:20:18.277 に答える
1

最初に の型をvalstolong intに変更します。これにより、少なくとも 30 ビットを格納し、curValtoの型をintscanf 呼び出しに一致させることができます。

次に、 に 5 ビットのみを割り当てていることを確認しますvals

vals = (vals << SIZE) | ( curVal | 0x1F );

最後の値を出力するときは、最下位 5 ビットのみを保持する必要があるため、 andビット演算子を使用します。

printf("%ld", vals & 0x1F );
于 2015-01-23T08:25:04.233 に答える
-1

アルファさん、6 つの値を格納したい場合は、for ループを 6 回実行する必要があります。そのため、<= in condition as idx<=NUM... が必要です。プログラムを出します。

于 2015-01-23T09:35:59.830 に答える