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; } } } 

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

MAX POW: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 0 0 2147483648 214748364 8

第二是有更好的方法吗?

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

 for(;i 

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

 printf("%u ", !!(num&maxPow)); 

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

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

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

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

 void printBits(unsigned int num) { for(int bit=0;bit<(sizeof(unsigned int) * 8); bit++) { printf("%i ", num & 0x01); num = num >> 1; } } 
 void print_bits(unsigned int x) { int i; for(i=8*sizeof(x)-1; i>=0; i--) { (x & (1 << i)) ? putchar('1') : putchar('0'); } printf("\n"); }