#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");
}
}
所以,最初我只是让计数器变量在循环中运行,我得到了正确答案的倒数。我真的不知道打印出逆的逆(正确答案)的干净方法。 我决定将计数器变量更改为数组并将值存储在其中,然后我决定向后运行循环以提供正确的位顺序。 如果有人知道解决此问题的更好方法,请分享您的建议。 谢谢。
听起来您想按照最重要的正常顺序打印位,这不能通过取余数模 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
}
}