C打印位

时间:2012-02-14 16:39:20

标签: 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

第二有更好的方法吗?

6 个答案:

答案 0 :(得分:16)

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

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

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

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

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:5)

为了解决第二点,我会考虑以下内容,为了便于理解,我们会对其进行简化。

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

该宏怎么样:

#define print_bits(x) \
do { \
        unsigned long long a__ = (x); \
        size_t bits__ = sizeof(x) * 8; \
        printf(#x ": "); \
        while(bits__--) putchar(a__ & (1 << bits__) ? '1' : '0'); \
        putchar('\n'); \
} while(0)

使用方式:

char c = 3;
int i = -1;
print_bits(c);
print_bits(i);

输出:

c: 00000011
i: 11111111111111111111111111111111

如果您不想打印表达式'x',这是'print_bits'的参数,请删除该行:

printf(#x ": "); \

此Marco可以用于任何原始数据类型,并且表达式'x'仅被评估一次。因此,您应该避免出现副作用。

答案 5 :(得分:0)

我想你可以删除一些代码和

void printB(unsigned int num){
    unsigned int size = sizeof(unsigned int);
    int i;
    for(i = size*8-1; i>= 0; i--){
        printf("%u",(num >>i) & 1 );
    }
    printf("\n");
}