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