二进制打印在C中不起作用
我试图在c中使用32位的位掩码打印二进制,但是在if语句中没有打印二进制表示二进制打印在C中不起作用,c,while-loop,binary,bit-manipulation,C,While Loop,Binary,Bit Manipulation,我试图在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");
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 <stdio.h>
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;
}
输出没有反转,不管在报告中说了什么
循环体可以通过最小的努力转换为函数,例如
void print\u binary(无符号值)
,然后从循环中调用该函数。编辑后的问题或多或少都是相同的循环,写了六次(!)是一种讽刺——不要这样写代码。当您像那样复制“n”粘贴代码时,有一个函数正在等待编写
#include <stdio.h>
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;
}
}
只要在范围内有print\u binary()
的原型,就不需要强制转换。从C99开始,您必须有一个函数声明,但不必是原型。然而,没有原型的编译是愚蠢的。如果您试图略读,您应该找到确保编译器抱怨的选项。对于GCC,您可以使用:
gcc -std=c11 -O3 -g -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …
您可以添加或不添加-Wold样式声明
或-Wold样式定义
,这取决于您正在处理的代码库和您正在使用的GCC版本(以及您在编写代码时的粗心程度)。还有其他选项,比如代码> Wshadow < /Cord>,但是如果你的代码与所示的代码进行了简洁的编译,就不太可能遇到许多逻辑问题。
定义了fmt\u binary()
后,可以编写main()
:
您是否尝试过在循环之前打印
bit\u mask
?它不是零就是非常负(比如-2147483648),不是吗?问题在于,您试图存储在位掩码中的值大于INT\u MAX
,因此会出现意外行为。也许您应该使用无符号整数
,它可能还有其他优点(比如将零而不是1移到最重要的位)代码>-->无符号位掩码=2147483648代码>,2和位掩码
-->1和位掩码
,位掩码>>1代码>-->位掩码>>=1代码>同样,结果是相反的。@Uriel:没有数字;循环条件为false,因此循环不会打印任何内容。只有标题行。@BLUEPIXY:你确定“反向”部分吗?2
是正在打印的值(当然它应该是一个变量)。正如在这些问题中常见的那样,这根本不是十进制到二进制的转换。它是二进制到二进制编码的ASCII码。如果它是十进制转换,它将充满10的除法和模。更好,但是我的任何程序员如果编写bit\u mask=2147483648
而不是bit\u mask=0x8000000
,仍然会被打耳光。
void fmt_binary(int value)
{
printf("Binary representation of %3d: ", value);
print_binary((unsigned)value);
putchar('\n');
}
gcc -std=c11 -O3 -g -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// … 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