使用按位运算从基数10转换为基数2
正如在标题中我试图将十进制数转换为二进制数。 我设置了最低的int作为我coudl
char * toBinary(int num) { int i = 1 <>= 1; printf("%d", i); getchar(); } }
但它不起作用,每次换class后i
仍然是负数,我改变了什么?
您的代码和您的代码描述都有几个错误。 这是一个更正版本:
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位)。 -
您没有从十进制转换为二进制。 输入数字已经是二进制的,您只需将其打印成二进制。
使用未签名的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的评论:要正确编写一个大小平台独立代码,请使用在limits.h
头文件中定义的CHAR_BIT
宏。 注意CHAR_BIT
是char
的位数,有可能在C的某些实现中,a字节可能不等于8位。
阅读: 什么是CHAR_BIT
?