ASCII到二进制计算是有缺陷的[关闭]

8yoxcaq7  于 2023-03-22  发布在  其他
关注(0)|答案(3)|浏览(107)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

2天前关闭。
Improve this question

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const int BYTE = 8;
void print_bulb(int bit);

int main(void)
{
    string message = get_string("message: ");
    int v = 0;
    for (int i = 0, len = strlen(message); i < len; i++)
    {
        int bits[BYTE];
        v = message[i];
        for (int j = 0; j < 8; j++)
        {
            bits[j] = v % 2;
            printf("%i\n" , bits[j]);
        }
    } 
}

void print_bulb(int bit)
{
    if (bit == 0)
    {
        // Dark emoji
        printf("\U000026AB");
    }
    else if (bit == 1)
    {
        // Light emoji
        printf("\U0001F7E1");
    }
}

我最初的想法是对ascii值进行2次模运算,并将它们存储在一个数组中,因为模运算只输出1和0,但我很快意识到这根本不起作用。代码对输入HI输出000000011111111,这不是预期的01001000 01001001
有没有一个更好的方法来解决这个问题使用国防部或有别的东西,我应该尝试代替?

pjngdqdw

pjngdqdw1#

要按自然顺序打印8位,您必须生成从最高有效位到最低有效位的位,并在字节之间打印一个空格:

#include <cs50.h>
#include <limits.h>
#include <stdio.h>

int main(void) {
    char *message = get_string("message: ");
    for (size_t i = 0; message[i] != '\0'; i++) {
        unsigned char v = message[i];
        unsigned char mask;
        for (mask = 1u << (CHAR_BIT - 1); mask; mask >>= 1) {
            putchar((v & mask) ? '1' : '0');
        }
        putchar(message[i + 1] ? ' ' : '\n');
    }
    return 0;
}
px9o7tmv

px9o7tmv2#

1.不要使用幻数。在limits.h中,有一个非常方便的宏定义,名为CHAR_BIT
1.使用unsigned数字进行所有算术运算。
1.您不需要调用strlen
1.你忘了除以二。
1.如果从最高有效位开始显示二进制数,人们会更好地阅读它们。

int main(void)
{
    string message = get_string("message: ");
    int v = 0;
    while (*message)
    {
        int bits[CHAR_BIT];
        unsigned char v = *message++;
        for (int j = CHAR_BIT - 1; j >= 0; j--)
        {
            bits[j] = !!(v & (1 << j));            
            printf("%i" , bits[j]);
        }
        printf("\n");
    } 
}

https://godbolt.org/z/oan56czGb

oyjwcjzk

oyjwcjzk3#

除以2。

bits[j] = v % 2;
v /= 2; // Add

使用无符号类型。

//int v = 0;
unsigned char v;

反转打印顺序。
或者等待C23并使用printf("%08hhb", message[i]);

相关问题