C++实现XNOR门递归代码输出位序反转问题及修正方法咨询
解决XNOR递归输出位序反转的问题
嘿,我明白你遇到的问题了——递归处理二进制位时,因为先取模得到最低位并输出,最后输出的顺序自然是从低位到高位,和我们想要的高位到低位正好相反。下面给你几种简单的解决思路:
方法一:调整递归输出顺序(最直接)
核心思路是先递归处理高位,再输出当前位的结果。这样递归会先深入到最高位,然后从最高位开始依次输出,顺序就正确了。修改后的代码如下:
#include <iostream> using namespace std; int xnor(int x, int y) { if (x > 0) { // 先递归处理更高位,再处理当前位 xnor(x / 10, y / 10); int reminder1 = x % 10; int reminder2 = y % 10; // 用三元运算符简化判断,也可以保留原if-else cout << (reminder1 == reminder2 ? 1 : 0); } return 0; // 这里返回值可以忽略,主要是完成输出逻辑 } int main() { xnor(110001, 101110); // 输出:100000 return 0; }
方法二:用字符串存储结果后反转
如果不想调整递归顺序,可以把每一步的计算结果存入字符串,最后反转字符串再输出。这种方法适合需要保留中间结果的场景:
#include <iostream> #include <string> #include <algorithm> // 用于reverse函数 using namespace std; string result_str; int xnor(int x, int y) { if (x > 0) { int reminder1 = x % 10; int reminder2 = y % 10; // 把字符形式的结果加入字符串 result_str += (reminder1 == reminder2 ? '1' : '0'); xnor(x / 10, y / 10); } return 0; } int main() { xnor(110001, 101110); reverse(result_str.begin(), result_str.end()); cout << result_str; // 输出:100000 return 0; }
方法三:计算结果数值而非直接输出
如果需要返回正确顺序的数值结果,可以通过递归计算每一位的权重,最后累加得到正确的整数:
#include <iostream> using namespace std; int xnor(int x, int y, int position = 1) { if (x == 0) { return 0; } int reminder1 = x % 10; int reminder2 = y % 10; int current_bit = (reminder1 == reminder2 ? 1 : 0); // 递归计算高位结果,加上当前位的数值(当前位*权重) return xnor(x / 10, y / 10, position * 10) + current_bit * position; } int main() { int result = xnor(110001, 101110); cout << result; // 输出:100000 return 0; }
为什么原代码会反转?
原代码中,你先处理当前的最低位(x%10)并输出,再递归处理高位。递归的执行顺序是先输出最低位,再依次输出更高位,最终结果自然是从低位到高位的顺序,和我们需要的高位到低位相反。调整输出时机或者存储后反转,就能解决这个问题啦~
内容的提问来源于stack exchange,提问作者jjjco
相关产品推荐
相关产品推荐

