我一直在进行一个项目,在该项目中,我们需要将名称的字母转换为它们的二进制等价形式。
A部分要求我们:
在字母的每个字节中按字母“ 0”或“ 1”显示(写入)每个位
您的姓氏,例如
B部分要求我们:
使用输入名称中的第一个字符作为遮罩
(按位或)其他字符的掩码并显示出来
就像在A部分那样
我的A部分代码可以正常工作并输出正确的二进制序列。
输出:http://imgur.com/kAAhHyc
不幸的是,我的代码似乎不适用于B部分。
我的代码:http://imgur.com/cKmQzyS
#include <stdio.h>
#include <string.h>
main() {
int i;
int len;
char name[20];
char len_str[20];
char a;
int x = 0;
int num;
int num2;
int y;
char a1;
char a2;
int z;
int num3;
write(1, "Enter your name: ", 17);
len = read(0, name, 20);
len--;
num = len;
num2 = len;
num3 = len;
/* part 1--------------------------------------*/
while (num > 0) {
a = name[x];
printf(&a);
printf(" ");
int mask = 128;
while (mask > 0) {
printf("%d", (a & mask) > 0);
printf(" ");
mask >>= 1;
}
x = x + 1;
printf("\n");
num--;
}
printf("\n");
/* part 2--------------------------------------*/
y = 0;
while (num2 > 0) {
a1 = name[y];
int mask2 = name[0];
printf("0");
printf(" ");
while (mask2 > 0) {
printf("%d", (a1 | mask2) > 0);
printf(" ");
mask2 >>= 1;
a1 <<= 1;
}
y = y + 1;
printf("\n");
num2--;
}
printf("\n");
}
从代码和输出中可以看到(A部分输出是第一个二进制块,B部分是第二个二进制块),我在上面张贴的内容似乎是错误的。我同时移动了掩码和字母中的位,但得到的输出不正确。我将AND“&”更改为OR“ |”。掩码是名称的第一个字母,即name [0],而不是我在A部分中看到的128。即使在相同方向上将两个位移位时,即mask2 >> = 1和a1 >> =我仍然得到错误的输出。有人可以帮助我解决这个问题。我知道我已经接近了,这一定是导致我受阻的一个小错误。
谢谢
最佳答案
将代码显示为函数中的二进制输出,将其称为void showBinary(char ch)
。
第一部分说对showBinary(name[x])
中的x做[0, strlen(name))
。
第二部分说对showBinary(name[0] | name[x])
中的x执行[1, strlen(name))
。
在这两个任务中,仅“ showBinary”操作的输入和调用会更改。 “ showBinary”的实际代码/操作是相同的。
使用一个函数来命名此操作并对代码进行分组可以使区分更加清晰,并使从逻辑角度更容易识别出差异。在这种情况下,差异是在第二种情况下“ showBinary”函数的循环内对[cc]的[不正确]更改。