将 int 的位向后放置在数组中

Posted

技术标签:

【中文标题】将 int 的位向后放置在数组中【英文标题】:Placing the bits of an int backwards in an array 【发布时间】:2022-01-12 20:10:54 【问题描述】:

大家好,我是一个初学者,这是我在这里的第一篇文章。对于一个更大的项目,我希望整数输入的每一位都向后放置在我创建的数组中。它 第一行工作得很好,但无论输入如何,数组的每一行都用 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);

【问题讨论】:

【参考方案1】:

在内部 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]);
    

【讨论】:

【参考方案2】:
    使用函数!! 你的表太短了,因为字节有 8 位而不是 7 位!!! 始终检查scanf 函数的返回值
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

【讨论】:

以上是关于将 int 的位向后放置在数组中的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 383 赎金信

如何将数组存储在 SQL 表中

将 atoi() 返回的 int 插入数组

C多级指针与多维数组

在 C 中反转数组

KMP算法