按位或分配

时间:2015-01-23 08:16:59

标签: c bit-shift bitwise-or

#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;
}

这是我正在处理的一些代码。它应该存储6个整数,每个整数在0到31的范围内,因此每个整数得到5位的空间。由于某种原因,它无法正常工作。当我在循环中对val进行赋值时,它似乎只是将读入的当前值存储到val中。你看到可能出现的问题吗?

3 个答案:

答案 0 :(得分: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添加到编译命令中。它会为你抓住这个。

答案 1 :(得分:1)

首次更改valslong int的类型,因此它可以存储至少30位和curValint的类型以匹配scanf调用。

然后确保只将5位分配给vals

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

当您打印最后一个值时,请使用按位运算符,因为您只想保留最低5位。

printf("%ld", vals & 0x1F );

答案 2 :(得分:-1)

先生。 Alpha,如果你想存储6个值,for循环必须运行6次。所以你需要&lt; =条件为idx&lt; = NUM​​ .... 还有一件事是你不是通过程序在任何地方存储。