CS50 PSET 2:灯泡。最简单的解决方案,但它有效:/ [关闭]

问题描述 投票:0回答:1
#include <cs50.h>
#include <stdio.h>
#include <string.h>

const int BITS_IN_BYTE = 8;

void print_bulb(int bit);

int main(void)
{
    // TODO
    string message = get_string("Message: ");

    int length = strlen(message);

    int i, j, counter;

    int bits[BITS_IN_BYTE];

    for (i = 0; i < length; i++)
    {
        counter = message[i];

        for (j = 0; j < BITS_IN_BYTE; j++)
        {
            if (counter % 2 == 0)
            {
                bits[j] = 0;
                counter /= 2;
            }
            else
            {
                bits[j] = 1;
                counter /= 2;
            }
        }

        for (j = BITS_IN_BYTE - 1; j > - 1; j--)
        {
            print_bulb(bits[j]);
        }
        printf("\n");
    }
}

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

所以,最初我只是让计数器变量在循环中运行,我得到了正确答案的倒数。我真的不知道打印出逆的逆(正确答案)的干净方法。 我决定将计数器变量更改为数组并将值存储在其中,然后我决定向后运行循环以提供正确的位顺序。 如果有人知道解决此问题的更好方法,请分享您的建议。 谢谢。

c computer-science cs50
1个回答
0
投票

听起来您想按照最重要的正常顺序打印位,这不能通过取余数模 2 然后除以 2 来实现。

这很容易通过使用位掩码来测试从最高到最低的位来完成,例如

// 0x80u is the highest bit in a byte
// mask >>= 1 shifts the mask right by one bit

for (unsigned int mask = 0x80u; mask != 0u; mask >>= 1)
{
    if (counter & mask)
        printf("\U0001F7E1"); // Light emoji
    else
        printf("\U000026AB"); // Dark emoji
}

使用这种方法,您不需要数组,您只需在测试时一次打印一个位即可。

注意你真的应该在这里使用无符号整数,例如对于你的

counter
变量,如果你正在做位掩码和移位。

如果你不知道位掩码和移位,这里有一些没有它们的等价物:

for (unsigned int bit = 128u; bit != 0u; bit /= 2u)
{
    if (counter >= bit)
    {
        printf("\U0001F7E1"); // Light emoji
        counter -= bit;
    }
    else
    {
        printf("\U000026AB"); // Dark emoji
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.