繁体   English   中英

如何从整数打印二进制

[英]How to print binary from an integer

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int testNums[] = {3, 0x12, 0xFF, -3};
    int testBits[] = {9, 7, 12, 15};
    int i;

    for (i = 0; i < sizeof(testNums) / sizeof(testNums[0]); i++)
        printBin(testNums[i], testBits[i]);
}

void printBin(int num, int bits)
{
    int pow;
    int mask = 1 << bits - 1;

    for(pow=0; pow<bits; pow++)
    {
        if(mask & num)
            printf("1");
        else
            printf("0");
        num<<1;
    }
    printf("\n");
}

它不会打印出正确的二进制数,但是具有正确的位数,并提供有关如何解决此问题的建议?

您的问题在这里,在printBin

num<<1;

该语句不执行任何操作。 您想要的是:

num<<=1;

为了清楚起见,您还应该在此处使用括号:

int mask = 1 << (bits - 1);

你应该将printBin上述main这样定义的函数被调用的时候是可见的。

最后, main应该始终返回int

您的代码中存在几个问题:

  1. 您需要printBin()的原型。
  2. 使用int main(void)int main(int argc, char** argv)代替void main()
  3. num<<1; 是没有副作用的表达式。 也许您可以从编译器的警告中推断出这一点。 num<<=1; 有所作为。
  4. 仅建议:为什么不将if语句替换为printf("%d", !!(mask & num));

这是使用clang编译时不会发出警告的固定代码:

#include <stdio.h>
#include <stdlib.h>

void printBin(int num, int bits);

int main(void)
{
        int testNums[] = {3, 0x12, 0xFF, -3};
        int testBits[] = {9, 7, 12, 15};
        int i;

        for (i = 0; i < sizeof testNums / sizeof testNums[0]; i++)
                printBin(testNums[i], testBits[i]);
        return 0;
}

void printBin(int num, int bits)
{
        int pow;
        int mask = 1 << (bits - 1);

        for(pow=0; pow<bits; pow++)
        {
                printf("%d", mask & num);
                num <<= 1;
        }
        putchar('\n');
}

输出:

000000011
0010010
000011111111
111111111111101

尽管您的方法是常规方法,并且@dbush的答案是适当的,但我想提及另一种方法。 您可能知道这一点,并且它不能很好地处理负值,但是通过这种方法,您可以轻松地将任何基数转换为其他基数

#include <stdio.h>
#include <string.h>
#define RESOLUTION 128

void compute(int number, int base, char* placeHolder){
    int k = 0;
    int i, j;
    char temp;
    while(number){
        placeHolder[k++] = "0123456789ABCDEF"[number % base];
        number /= base;
    }
    if (k != 0) {
      placeHolder[k] = '\0';
      for(i = 0, j = strlen(placeHolder) - 1; i < j; i++, j--){
        temp = placeHolder[i];
        placeHolder[i] = placeHolder[j];
        placeHolder[j] = temp;
      }
    }else{
        placeHolder[0] = '0';
        placeHolder[1] = '\0';
    }
}


int main(void) {
    char bin[RESOLUTION];
    compute(0xFF, 10, bin);
    printf("%s\n", bin);
    return 0;
}

您可以RESOLUTION更改RESOLUTION值。

更特定于二进制文件,您可以打印任何数据类型的二进制文件,例如:

void printBits(size_t const size, void const * const ptr)
{
    unsigned char *b = (unsigned char*) ptr;
    unsigned char byte;
    int i, j;

    for (i=size-1;i>=0;i--)
    {
        for (j=7;j>=0;j--)
        {
            byte = b[i] & (1<<j);
            byte >>= j;
            printf("%u", byte);
        }
    }
    puts("");
}


int main()
{
        int i = 23;
        uint ui = UINT_MAX;
        float f = 23.45f;
        printBits(sizeof(i), &i);
        printBits(sizeof(ui), &ui);
        printBits(sizeof(f), &f);
        return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM