我是C的初学者。在编写代码时,我注意到了这一点。
要异或字符数组中的元素,为什么有些显示0/1,有些显示ASCII?如何让它们都表现为数字0或1?
在XOR函数中,我要对两个数组中的元素进行异或运算并将结果存储在另一个数组中。
主要是做一些实验。
顺便说一句,除了打印结果,我还要执行0 1二进制操作。例如加密和解密。
这是一段C代码。
<?xml version="1.0" standalone="no"?>
<g font-family="Verdana" font-size="45" >
<text x="200" y="150" fill="blue" >
But you
<tspan dx="2em" dy="-50" font-weight="bold" fill="red" >
are
</tspan>
<tspan dy="100">
a peach!
</tspan>
yes
</text>
</g>
</svg>
结果
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int XOR(char *u, char *w, char *v)
{
for(int i = 0; i < 16; i++)
{
u[i] = w[i] ^ v[i];
}
return 0;
}
int PrintList(char *list, int n)
{
for(int i = 0; i < n; i++)
{
printf("%d", list[i]);
}
return 0;
}
int main()
{
char u[17] = "";
char w[17] = "0001001000110100";
char v[17] = "0100001100100001";
XOR(u, w, v);
PrintList(u, 16);
printf("\n");
char w2[17] = "1000110011101111";
XOR(u, w2, v);
PrintList(u, 16);
printf("\n");
char v2[17] = "1111111011001000";
XOR(u, w2, v2);
PrintList(u, 16);
printf("\n");
char x[17] = "0101101001011010";
XOR(u, x, u);
PrintList(u, 16);
printf("\n");
memcpy(w, u, 16);
XOR(u, w, v);
PrintList(u, 16);
printf("\n");
return 0;
}
好吧,可能是由于0101000100010101
1100111111001110
0111001000100111
48484948494848484849494949494849
0110101101011100
Process returned 0 (0x0) execution time : 0.152 s
Press any key to continue.
,我的声明从char
更改为unsigned char
,打印结果没有变化。更改为printf("%d", list[i]);
打印结果:
printf("%c", list[i]);
答案 0 :(得分:1)
这些是字符串,因此您最初具有ASCII码48(0011 0000)和49(0011 0001)。 ^
运算符是按位XOR,因此两个值分别为48和49的操作数的结果可以为0或1。将结果打印为整数时,将得到预期的0或1。
但是,如果以后使用该操作的结果,则不再具有ASCII代码数组,而是具有值0或1的整数数组。如果将那个与 is < / em>仍然是ASCII码数组,例如0011 0000 ^ 0
,您将得到结果0011 0000
,而不是0
。所以printf给你48等。
答案 1 :(得分:1)
字符“ 0”的二进制值为00110000。 “ 1”是00110001。
'0' ^ '0' = 00000000 (0)
'0' ^ '1' = 00000001 (1)
'1' ^ '1' = 00000000 (0)
但是您可以重用u
数组。
'0' ^ 0 = 0011000 (48)
'0' ^ 1 = 0011001 (49)
'1' ^ 0 = 0011001 (49)
'1' ^ 1 = 0011000 (48)