C:在二进制基础中打印无符号Int

时间:2017-11-16 09:58:13

标签: c binary unsigned-integer

我必须制作自己的printf(用于练习)并且我必须添加%b标志,该标志在二进制基础中打印无符号数字。我已经创建了该函数,但我仍然在输出中得到无符号数。你有我的代码。提前谢谢!

int unsignednbr(unsigned int nb)
{
    if (nb < 0)
    {
        putchar('-');
        nb = nb * -1;
    }
    if (nb >= 10)
    {
        putnumber(nb / 10);
        putnumber(nb % 10);
    }
    else
        putchar(nb + '0');
}

int unsigned_to_binary(int nb)
{
    long long binary_nbr = 0;
    int remainder;
    int i = 0;

    unsignednbr(nb);
    while (nb != 0)
    {
        remainder = nb % 2;
        nb /= 2;
        binary_nbr += remainder * i;
        i *= 10;
    }
}

void own_printf(char* format, ...)
{
    int i = 0;
    va_list args;

    va_start(args, format);
    while (format[i])
    {
        if (format[i] == '%')
        {
            switch (format[i + 1])
            {
            case 'b':
                unsigned_to_binary (va_arg( args, int));
                break;
            }
            i++;
        }
    }
    va_end(args);
}

int main()
{
    own_printf("%b", -42);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

我打赌你来自Epitech,你试过问一个助教吗? :P

无论如何,如果您只想打印数字的二进制表示,则可以在循环中使用>>&运算符的组合。您将迭代int的32位中的每一位,确定它是1还是0并打印出来。

unsigned int number = 42;
for (int i = 0; i < 32; ++i) {
  if (number >> i & 0x1) putchar('1');
  else putchar('0');
}

putchar('\n');

这种方法有许多缺点(没有缓冲,慢,假设int是32位......)但它应该可以工作。

除此之外,您可能需要在代码中查看一些内容:

  • 在函数unsignednbr中,检查您收到的作为参数的unsigned int是否小于0。这是一个总是错误的条件。
  • while函数中的unsigned_to_binary循环后,您不打印任何内容。那么这个循环的目的是什么?请记住,值传递的参数是实际副本,并且您对这些副本所做的修改对于接收副本的函数是本地的。在循环之前调用unsignednbr函数似乎没用。
  • 如果你有时间,请使用函数指针数组重写主循环。这将使助手们开心! :P
祝你好运! :d

答案 1 :(得分:0)

您可以使用以下(使用递归):

void printBinaryValue(unsigned int num)
{
    if(!num) return;

    printBinaryValue(num>>1);
    putchar(((num&1 == 1) ? '1' : '0'));
}

看到它正常工作here

<强>已更新
以下代码将为所有输入提供所需的输出,包括0使用while-loop )。

 void printBinaryValue2(unsigned int num)
 {
    char result[sizeof(num)*8]; 
    int count = 0;
    while(num)
    {
        result[count++] = ((num&1 == 1) ? '1' : '0'); 
        num>>=1;
    }
    if(count)
    {
        count--;
        while(count>=0)
        {
            putchar(result[count--]);
        }   
    }
    else
    {
        putchar('0');   
    }
 }