按位或和赋值
bitwise or and assignment
#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 位的 space。由于某种原因,它不起作用。当我在循环中对 vals 进行赋值时,它似乎只是将读入的当前值存储到 vals 中。您知道可能出了什么问题吗?
一个半途而废的编译器会告诉你:
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
添加到您的编译命令中。它会为你捕捉到这个。
先把vals
的类型改成long int
,这样至少能存30位,把curVal
的类型改成int
来匹配scanf打电话。
然后确保你只分配 5 位给 vals
:
vals = (vals << SIZE) | ( curVal | 0x1F );
并且当您打印最后一个值时,请使用 和 按位运算符,因为您只想保留最低有效的 5 位。
printf("%ld", vals & 0x1F );
先生Alpha,如果你想存储 6 个值,for 循环必须 运行 for 6 times.so 你需要 <= in condition as idx<=NUM....
还有一件事是您在整个程序中没有存储在任何地方。
#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 位的 space。由于某种原因,它不起作用。当我在循环中对 vals 进行赋值时,它似乎只是将读入的当前值存储到 vals 中。您知道可能出了什么问题吗?
一个半途而废的编译器会告诉你:
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
添加到您的编译命令中。它会为你捕捉到这个。
先把vals
的类型改成long int
,这样至少能存30位,把curVal
的类型改成int
来匹配scanf打电话。
然后确保你只分配 5 位给 vals
:
vals = (vals << SIZE) | ( curVal | 0x1F );
并且当您打印最后一个值时,请使用 和 按位运算符,因为您只想保留最低有效的 5 位。
printf("%ld", vals & 0x1F );
先生Alpha,如果你想存储 6 个值,for 循环必须 运行 for 6 times.so 你需要 <= in condition as idx<=NUM.... 还有一件事是您在整个程序中没有存储在任何地方。