You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中char数组异或运算异常:奇数位输出空白字符求助

问题分析与解决方案

我一眼就看出问题所在了——你混淆了字符'1'/'0'的ASCII数值和它们代表的数字值,这才导致输出出现空白字符。

为什么会出现不可打印的空白?

你定义的td数组里存的是字符类型的'1'和'0',它们在ASCII表中对应的数值是49(0x31)和48(0x30)。当你直接对这些char做异或运算时,操作的是它们的ASCII码,而不是你以为的数字0或1:

  • 比如'1' ^ '1' = 49 ^ 49 = 0,对应的是ASCII里的空字符(NUL),这是不可打印的控制字符,所以显示成空白;
  • '1' ^ '0' = 49 ^ 48 = 1,对应的是标题开始符(SOH),同样不可打印;
  • 只有当异或结果恰好等于48(也就是'0'的ASCII码)时,才会显示正常的字符0——这就是你看到偶数位置结果正确的原因。

修正后的代码

解决思路很简单:先把字符转换成对应的整数(0或1),完成异或运算后,再转换回字符类型的'0'或'1'。这里是修正后的完整代码:

char td[] = {'1','0','0','1','1','1'}; 
char s_td[] = new char[td.length]; 

for(int i=0; i<td.length; i++) { 
    // 将当前td的字符转为数字值(0或1)
    int currentTdNum = td[i] - '0';
    int xorResult;
    
    if(i == 0) {
        // 取最后一个td元素的数字值
        int lastTdNum = td[td.length - 1] - '0';
        xorResult = lastTdNum ^ currentTdNum;
    } else {
        // 取前一个s_td元素的数字值
        int prevSNum = s_td[i-1] - '0';
        xorResult = prevSNum ^ currentTdNum;
    }
    // 将异或结果转回字符(加'0'得到对应ASCII码)
    s_td[i] = (char) (xorResult + '0');
} 

// 输出结果
for(char c : s_td) System.out.print(c);

运行结果

执行这段代码后,会输出你期望的000101,完全符合预期。

简化写法(可选)

如果想让代码更简洁,可以把重复的转换逻辑提炼出来,比如:

char td[] = {'1','0','0','1','1','1'}; 
char s_td[] = new char[td.length]; 

// 初始化第一个元素
int prevValue = td[td.length - 1] - '0';
s_td[0] = (char)((prevValue ^ (td[0] - '0')) + '0');

// 处理后续元素
for(int i=1; i<td.length; i++) {
    prevValue = s_td[i-1] - '0';
    s_td[i] = (char)((prevValue ^ (td[i] - '0')) + '0');
}

// 输出
for(char c : s_td) System.out.print(c);

内容的提问来源于stack exchange,提问作者Rupali Kishore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:59:23