将 int 的位向后放置在数组中
Placing the bits of an int backwards in an array
大家好,我是一个完全的初学者,这是我第一次 post 来到这里。对于更大的项目,我希望将整数输入的每一位倒置放置在我创建的数组中。它
第一行工作得很好,但无论输入如何,数组的每一行都用 0 填充。有什么建议吗??
#include<stdio.h>
int main(int argc, char *argv[]){
unsigned short int canvoted, mask;
unsigned short int individualvote[3][7]={{0}};
int i, j;
mask=0b1;
for(i=0; i<3; i++){
printf("Give an int:\n");
scanf("%hu", &canvoted);
for(j=0; j<7; j++){
individualvote[i][j] = canvoted & mask;
individualvote[i][j] = individualvote[i][j] >> j;
mask = mask << 1;
printf("%hu ", individualvote[i][j]);
}
printf("\n##\n");
}
return(0);
}
在内部 for 循环中,您正在更改变量 mask
mask = mask << 1;
并且不会在外部 for 循环中将其重置为初始值。
移动这个表达式语句
mask=0b1;
在外部 for 循环内。
for(i=0; i<3; i++){
mask=0b1;
//...
其实变量mask
是多余的。您可以在没有变量的情况下更简单地编写内部 for 循环,从而避免错误。例如
for(j=0; j<7; j++){
individualvote[i][j] = canvoted & 1;
canvoted >>= 1;
printf("%hu ", individualvote[i][j]);
}
甚至喜欢
for(j=0; j<7 && canvoted != 0; j++){
individualvote[i][j] = canvoted & 1;
canvoted >>= 1;
printf("%hu ", individualvote[i][j]);
}
- 使用函数!!
- 您的 table 太短了,因为字节有 8 位而不是 7 位!!!
- 始终检查
scanf
函数的 return 值
unsigned short *fillBits(unsigned short *array, unsigned char val)
{
unsigned short *wrk = array;
memset(array, 0, sizeof(val) * CHAR_BIT);
while(val)
{
*wrk++ = val & 1;
val >>= 1;
}
return array;
}
int main(int argc, char *argv[]){
unsigned char canvoted, mask;
unsigned short int individualvote[3][CHAR_BIT]={{0}};
size_t i;
for(i=0; i<3; i++)
{
printf("\nGive an int:\n");
if(scanf("%hhu", &canvoted) != 1) {printf("Scanf error"); return 1;}
fillBits(individualvote[i], canvoted);
}
printf("\n");
for(i=0; i<3; i++)
{
for(size_t bit = 0; bit < CHAR_BIT; bit++)
printf("%hd", individualvote[i][bit]);
printf("\n");
}
return(0);
}
https://godbolt.org/z/98oYca4qz
对于数据:255, 128, 15
输出是
11111111
00000001
11110000
大家好,我是一个完全的初学者,这是我第一次 post 来到这里。对于更大的项目,我希望将整数输入的每一位倒置放置在我创建的数组中。它 第一行工作得很好,但无论输入如何,数组的每一行都用 0 填充。有什么建议吗??
#include<stdio.h>
int main(int argc, char *argv[]){
unsigned short int canvoted, mask;
unsigned short int individualvote[3][7]={{0}};
int i, j;
mask=0b1;
for(i=0; i<3; i++){
printf("Give an int:\n");
scanf("%hu", &canvoted);
for(j=0; j<7; j++){
individualvote[i][j] = canvoted & mask;
individualvote[i][j] = individualvote[i][j] >> j;
mask = mask << 1;
printf("%hu ", individualvote[i][j]);
}
printf("\n##\n");
}
return(0);
}
在内部 for 循环中,您正在更改变量 mask
mask = mask << 1;
并且不会在外部 for 循环中将其重置为初始值。
移动这个表达式语句
mask=0b1;
在外部 for 循环内。
for(i=0; i<3; i++){
mask=0b1;
//...
其实变量mask
是多余的。您可以在没有变量的情况下更简单地编写内部 for 循环,从而避免错误。例如
for(j=0; j<7; j++){
individualvote[i][j] = canvoted & 1;
canvoted >>= 1;
printf("%hu ", individualvote[i][j]);
}
甚至喜欢
for(j=0; j<7 && canvoted != 0; j++){
individualvote[i][j] = canvoted & 1;
canvoted >>= 1;
printf("%hu ", individualvote[i][j]);
}
- 使用函数!!
- 您的 table 太短了,因为字节有 8 位而不是 7 位!!!
- 始终检查
scanf
函数的 return 值
unsigned short *fillBits(unsigned short *array, unsigned char val)
{
unsigned short *wrk = array;
memset(array, 0, sizeof(val) * CHAR_BIT);
while(val)
{
*wrk++ = val & 1;
val >>= 1;
}
return array;
}
int main(int argc, char *argv[]){
unsigned char canvoted, mask;
unsigned short int individualvote[3][CHAR_BIT]={{0}};
size_t i;
for(i=0; i<3; i++)
{
printf("\nGive an int:\n");
if(scanf("%hhu", &canvoted) != 1) {printf("Scanf error"); return 1;}
fillBits(individualvote[i], canvoted);
}
printf("\n");
for(i=0; i<3; i++)
{
for(size_t bit = 0; bit < CHAR_BIT; bit++)
printf("%hd", individualvote[i][bit]);
printf("\n");
}
return(0);
}
https://godbolt.org/z/98oYca4qz
对于数据:255, 128, 15
输出是
11111111
00000001
11110000