Java中二进制字符串的异或操作

8
我正在使用以下代码对两个字符串执行XOR操作。
String lseq = "0011111111101111111111111100101101111100110000001011111000010100";
String tseq = "0011111111100000110011001100110011001100110011001100110011001100";

StringBuilder sb = new StringBuilder();

for(int i = 0; i < lseq.length(); i++)
    sb.append((lseq.charAt(i) ^ tseq.charAt(i)));

String result = sb.toString();
System.out.println(result);

上述代码给出了正确的输出结果:
0000000000001111001100110000011110110000000011000111001011011000

我需要再对一个字符串进行异或操作

String hseq = "0011111111110010010111110100010111100000101101001110000100011110";

如果我尝试执行 sb.append((lseq.charAt(i) ^ tseq.charAt(i) ^ hseq.charAt(i));

我得到的结果是:

48484848484848484848484948484948494848494848494949484848494848494848494849494848484949494948484848484948494948494949484948484948

这是错误的。我需要帮助在三个二进制字符串之间执行异或操作。


2
你混淆了比特和字符。字符“0”与比特‘0’无关。 - leonbloy
@leonbloy 嗯,它以 0 结尾。0011 000``0 - John Dvorak
3个回答

8
我会这样做。
private static boolean bitOf(char in) {
    return (in == '1');
}

private static char charOf(boolean in) {
    return (in) ? '1' : '0';
}

public static void main(String[] args) {
    String lseq ="0011111111101111111111111100101101111100110000001011111000010100";
    String tseq ="0011111111100000110011001100110011001100110011001100110011001100";
    String hseq ="0011111111110010010111110100010111100000101101001110000100011110";

    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < lseq.length(); i++) {
        sb.append(charOf(bitOf(lseq.charAt(i)) ^ bitOf(tseq.charAt(i))
                ^ bitOf(hseq.charAt(i))));
    }

    String result = sb.toString();
    System.out.println(result);
}

这个输出

0011111111111101011011000100001001010000101110001001001111000110

1
为什么不使用Character.digit(ch,2)和Character.forDigit(int,2)在字符和位之间进行双向转换呢? - Patricia Shanahan

1
您可以考虑类似于这样的内容:

您还可以考虑类似以下代码:

String lseq = "0011111111101111111111111100101101111100110000001011111000010100";
String tseq = "0011111111100000110011001100110011001100110011001100110011001100";
String hseq = "0011111111110010010111110100010111100000101101001110000100011110";

StringBuilder sb = new StringBuilder();

for(int i = 0; i < lseq.length(); i++)
    sb.append((lseq.charAt(i) - '0' ^ tseq.charAt(i) - '0' ^ hseq.charAt(i) - '0'));

String result = sb.toString();
System.out.println(result);

在底层,char 被当作 int 处理,因为数字值代表预定义的字符。我们可以从字符 '0' 的值中减去我们的字符(知道 '1' 的值比 '0' 大 1),得到 0 或 1,这可以与 ^ 运算符一起使用。

0
你可以使用BigInteger,它会使你的代码更简单。它有一个构造函数,你可以传递一个字符串和你想使用的基数(在你的情况下是2)。

然后你可以调用public BigInteger xor(BigInteger val)来执行XOR操作(参见docs或查看openjdk BigInteger's code)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接