【问题标题】:Placing the bits of an int backwards in an array将 int 的位向后放置在数组中
【发布时间】: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);
}

【问题讨论】:

    标签: arrays c for-loop bitwise-operators bit


    【解决方案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】:
      1. 使用函数!!
      2. 你的表太短了,因为字节有 8 位而不是 7 位!!!
      3. 始终检查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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-18
        • 2017-10-02
        • 1970-01-01
        • 1970-01-01
        • 2013-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多