Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
二进制打印在C中不起作用_C_While Loop_Binary_Bit Manipulation - Fatal编程技术网

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

二进制打印在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");

我试图在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 <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