使用按位运算从基数10转换为基数2

时间:2013-10-08 17:13:22

标签: c

在标题中我试图将十进制数转换为二进制数。 我设置了最低的int as coudl

char * toBinary(int num)
{

    int i = 1 << 31;
    while(i!=0)
    {
        if((num & i) == 0 )
            printf("0");
        else
            printf("1");
        i >>= 1;
        printf("%d", i);
        getchar();
    }
}

但它不起作用,每班次i仍为负数,我改变了什么?

2 个答案:

答案 0 :(得分:5)

您的代码和您的代码描述都有几个错误。这是一个更正版本:

void print_binary(unsigned x)
{
    for (unsigned bit = 1u << 31; bit != 0; bit >>= 1)
        putchar((x & bit) ? '1' : '0');
}

错误:

  • 该函数不应返回char *,因为它不会返回任何内容。如果你想创建一个返回字符串的函数,那就不同了。

  • 您无法计算1 << 31,因为这是溢出。您必须使用无符号数字:1u << 31是可以的(假设int是32位)。

  • 您没有从十进制转换为二进制。输入数字已经是二进制的,您只需将其打印成二进制文件。

答案 1 :(得分:3)

使用未签名的i

int i = 1 << 31;

更正为:

unsigned int i = 1u << 31;

此外,我建议你不要使用31来编写与大小无关的代码(int的大小可以在不同的机器中有所不同)。

喜欢:

unsigned int mask = 1u << ((sizeof(unsigned int) * CHAR_BIT) - 1);   

我将mask命名为i,编写如下代码。

//conversion 
unsigned int mask = 1u << ((sizeof(unsigned int) * CHAR_BIT) - 1);   
while(mask > 0){
  if((num & mask) == 0 )
       printf("0");
  else
       printf("1")
   mask = mask >> 1 ;  // Right Shift 
}

来自@ Carl Norum的评论:要正确编写大小平台独立代码,请使用CHAR_BIT头文件中定义的limits.h宏。注意CHAR_BITchar中的位数,并且在C的某些实现中,一个字节可能等于8位。

阅读:What is CHAR_BIT?