二进制打印在C中不起作用

我正在尝试使用c中的32位位掩码打印二进制文件,但二进制表示不会在if语句中打印出来。

unsigned int bit_mask = 2147483648; int decimal = 2; printf("\nBinary representation of 2: \n"); while(bit_mask > 0){ if((decimal & bit_mask) == 0) printf("0"); else printf("1"); bit_mask = bit_mask >> 1; } decimal = 255; printf("\n\nBinary representation of 255: \n"); while(bit_mask > 0){ if((decimal & bit_mask) == 0) printf("0"); else printf("1"); bit_mask = bit_mask >> 1; } decimal = 32; printf("\n\nBinary representation of 32: \n"); while(bit_mask > 0){ if((decimal & bit_mask) == 0) printf("0"); else printf("1"); bit_mask = bit_mask >> 1; } decimal = -1; printf("\n\nBinary representation of -1: \n"); while(bit_mask > 0){ if((decimal & bit_mask) == 0) printf("0"); else printf("1"); bit_mask = bit_mask >> 1; } decimal = -255; printf("\n\nBinary representation of -255: \n"); while(bit_mask > 0){ if((decimal & bit_mask) == 0) printf("0"); else printf("1"); bit_mask = bit_mask >> 1; } int random_number = (rand() % INT_MAX) + (rand() % INT_MIN); printf("\n\nBinary representation of %d: \n", random_number); while(bit_mask > 0){ if((random_number & bit_mask) == 0) printf("0"); else printf("1"); bit_mask = bit_mask >> 1; } 

PS:该程序现在仅适用于2但仍未打印其他值(255,32,-1,-255)

如果BLUEPIXY和我自己建议的修正,代码将以正确的顺序产生答案。

 #include  int main(void) { for (unsigned value = 2; value < 1024; value = value * 3 + 1) { unsigned bit_mask = 0x80000000; // 2147483648 printf("Binary representation of %3u: ", value); while (bit_mask > 0) { if ((value & bit_mask) == 0) printf("0"); else printf("1"); bit_mask >>= 1; } putchar('\n'); } return 0; } 

输出:

 Binary representation of 2: 00000000000000000000000000000010 Binary representation of 7: 00000000000000000000000000000111 Binary representation of 22: 00000000000000000000000000010110 Binary representation of 67: 00000000000000000000000001000011 Binary representation of 202: 00000000000000000000000011001010 Binary representation of 607: 00000000000000000000001001011111 

尽管BLUEPIXY在评论中表示,但产出并未逆转。


可以用最小的努力将循环体转换为诸如void print_binary(unsigned value)类的函数,然后从循环中调用该函数。 编辑过的问题或多或少相同的循环写出六(!)次是一个讽刺 – 不要编写这样的代码。 当你复制’n’这样的代码时,会有一个等待写入的函数。

 #include  void print_binary(unsigned value) { unsigned bit_mask = 0x80000000; // 2147483648 while (bit_mask > 0) { if ((value & bit_mask) == 0) printf("0"); else printf("1"); bit_mask >>= 1; } } 

此函数可用于打印unsigned int的二进制表示,而无需添加任何装饰。 它可以合理地使用。 在此特定上下文中,您可以编写一个包装函数来处理其他格式:

 void fmt_binary(int value) { printf("Binary representation of %3d: ", value); print_binary((unsigned)value); putchar('\n'); } 

只要你在范围内有print_binary()的原型,就print_binary() 。 从C99开始,您必须有一个函数声明,但不必是原型。 但是,没有原型的编译是愚蠢的。 如果你试图吝啬,你应该找到确保你的编译器抱怨的选项。 对于GCC,您可以使用:

 gcc -std=c11 -O3 -g -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes … 

您可能会也可能不会添加-Wold-style-declaration-Wold-style-definition具体取决于您正在处理的代码库以及您正在使用的GCC版本(以及您编写代码的粗心程度)。 您还可以考虑其他选项,例如-Wshadow ,但如果您的代码与所显示的内容完全编译,则不太可能遇到许多不是逻辑问题的问题。

定义了fmt_binary() ,您可以编写main()

 #include  #include  #include  #include  // … declarations or definitions of fmt_binary and print_binary int main(void) { for (int value = 2; value < 1024; value = value * 3 + 1) fmt_binary(value); fmt_binary(2); fmt_binary(255); fmt_binary(32); fmt_binary(-1); fmt_binary(-255); srand(time(0)); // Better than no call to srand() int random_number = (rand() % INT_MAX) + (rand() % INT_MIN); fmt_binary(random_number); return 0; } 

示例输出可能是:

 Binary representation of 2: 00000000000000000000000000000010 Binary representation of 7: 00000000000000000000000000000111 Binary representation of 22: 00000000000000000000000000010110 Binary representation of 67: 00000000000000000000000001000011 Binary representation of 202: 00000000000000000000000011001010 Binary representation of 607: 00000000000000000000001001011111 Binary representation of 2: 00000000000000000000000000000010 Binary representation of 255: 00000000000000000000000011111111 Binary representation of 32: 00000000000000000000000000100000 Binary representation of -1: 11111111111111111111111111111111 Binary representation of -255: 11111111111111111111111100000001 Binary representation of -1758826555: 10010111001010100110111111000101