C打印位

sam*_*ray 10 c

我试图在C中编写一个打印int的程序.由于某种原因我得到错误的价值观,

void printBits(unsigned int num){
    unsigned int size = sizeof(unsigned int);
    unsigned int maxPow = 1<<(size*8-1);
    printf("MAX POW : %u\n",maxPow);
    int i=0,j;
    for(;i<size;++i){
        for(j=0;j<8;++j){
            // print last bit and shift left.
            printf("%u ",num&maxPow);
            num = num<<1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题,首先是为什么我得到这个结果(对于printBits(3)).

最大电平:2147483648 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2147483648 214748364 8

第二是有更好的方法吗?

das*_*ght 15

您正在正确计算结果,但您没有正确打印它.你也不需要第二个循环:

for(;i<size*8;++i){
    // print last bit and shift left.
    printf("%u ",num&maxPow ? 1 : 0);
    num = num<<1;
}
Run Code Online (Sandbox Code Playgroud)

如果您想炫耀,可以用两个感叹号替换条件:

printf("%u ", !!(num&maxPow));
Run Code Online (Sandbox Code Playgroud)


Dan*_*her 8

你得到的结果是因为num&maxPow0或maxPow.要打印1而不是maxPow,您可以使用printf("%u ", num&maxPow ? 1 : 0);.打印位的另一种方法是

while(maxPow){
    printf("%u ", num&maxPow ? 1 : 0);
    maxPow >>= 1;
}
Run Code Online (Sandbox Code Playgroud)

即将位掩码向右而不是num向左移位.当掩码的设置位移出时,循环结束.


Ada*_*vis 5

为了解决第二点,我会考虑以下内容,为了便于理解,这有点简化.

void printBits(unsigned int num)
{
   for(int bit=0;bit<(sizeof(unsigned int) * 8); bit++)
   {
      printf("%i ", num & 0x01);
      num = num >> 1;
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 我仍在努力理解字节序,但我是否正确地认为这以“大字节序”打印位,而不是更常见的“小字节序”?例如,“1 0 0 0 0 0 0”表示 8 位中的数字“1”,而“0 0 0 0 0 0 0 1”则表示小端字节序中的相同数字。 (2认同)