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
相关产品推荐
相关产品推荐

