【发布时间】:2021-07-19 23:52:56
【问题描述】:
我在 C 语言中进行 XOR 运算时遇到了几个小时的问题。
我正在尝试对两个char * 的内容进行异或运算。
char* toto = malloc(sizeof(char)*5);
char* bob = malloc(sizeof(char)*5);
它们都只包含 0 和 1,每个都有 5 个插槽。
toto 的 printf 返回 00011 和 bob 返回 11111。
printf("%s", toto) => 11111
printf("%s", bob) => 00011
这是我最终尝试异或的两个值。
首先我按步骤进行:
1- 将它们中的每一个翻译成int 值
int val_toto = atoi(toto);
int val_bob = atoi(bob);
// printf("%d", val_toto) => 11111
// printf("%d", val_bob) => 11
你可以看到 bob 中的0 消失了,没问题。
2- 在它们各自相同的位之间使用 XOR 运算符 ^
int result = val_toto ^ val_bob;
问题来了:
printf("%d", result) => 11116
异或运算的结果应该是
11111
^ 00011 // the 0 are taken care of even if not showed in printf
-------
11100 // but I get 1116 ???
真正的问题是,只有当我将该组合用于toto 和bob 时,才会出现问题。 XOR 操作适用于所有这些,例如:
toto => 00101 // as char*
bob => 000001
//then I use atoi() with each of them
toto => 101 // as int
bob => 1
结果我得到了预期的结果:
101 XOR 1 => 100 //as int
你知道为什么它在上面的组合中可以正常工作,但在我有 11111 时却没有?
谢谢
【问题讨论】:
-
atoi转换以十进制而不是二进制写入的整数。你有 11111 base 10 而不是 11111 base 2。第一个是一万一千和变化;第二个是 31。 -
你在对十进制数进行操作,就好像它们是二进制数一样,所以这不会很好......
-
char* toto = malloc(sizeof(char)*5);->char* toto = malloc(sizeof(char)*6); -
感谢您的回答我明白我做错了什么。我的代码中也有大小为 5+1 的 malloc,只是忘记在这里写了,谢谢提醒 :)