XOR在JAVA中提供意外输出

时间:2016-09-30 18:36:57

标签: java bit-manipulation bitwise-operators xor bitwise-xor

我正在尝试在JAVA中实现有限字段,为此我需要对两个二进制数进行异或。 这是我的代码:

            String lastdigits="1000110";
            int overflow=11;
            int lastdigitsint=Integer.parseInt(lastdigits);
            int result=(int) lastdigitsint^overflow;

变量'overflow'的值为11。 当我使用overflow(= 11)对lastdigitsint进行XORing时,输出应为1000101.但是,代码输出为1095.

有人可以解释为什么会这样吗?谢谢。

2 个答案:

答案 0 :(得分:1)

从一开始就错了

    String lastdigits="1000110";
    int lastdigitsint=Integer.parseInt(lastdigits);

最后一位数值将是1000110 - 那是一千万个houndred和十个 所以二进制表示与你的期望大不相同。 你想做的只是:

int lastdigitsint=0b1000110;

这是正确的二进制整数。

所以:

public static void main(String[] args) {
    String lastdigits = "1000110";
    int overflow = 0b11;
    int lastdigitsint = Integer.parseInt(lastdigits);
    int result = lastdigitsint ^ overflow;

    System.out.println("Dec:" + lastdigitsint);
    System.out.println("Dec:" + overflow);
    System.out.println("Dec:" + result);
    System.out.println("Bin" + Integer.toBinaryString(lastdigitsint));
    System.out.println("Bin" + Integer.toBinaryString(overflow));
    System.out.println("Bin" + Integer.toBinaryString(result));

    System.out.println("And now the proper way:");
    lastdigitsint = 0b1000110;
    result = lastdigitsint ^ overflow;

    System.out.println("Dec:" + lastdigitsint);
    System.out.println("Dec:" + overflow);
    System.out.println("Dec:" + result);
    System.out.println("Bin" + Integer.toBinaryString(lastdigitsint));
    System.out.println("Bin" + Integer.toBinaryString(overflow));
    System.out.println("Bin" + Integer.toBinaryString(result));
}

结果:

Dec:1000110
Dec:3
Dec:1000109
Bin:11110100001010101110
Bin:11
Bin:11110100001010101101
And now the proper way:
Dec:70
Dec:3
Dec:69
Bin:1000110
Bin:11
Bin:1000101

接缝对我来说是合法的。

答案 1 :(得分:1)

你不是在考虑你认为你是XORing的数字。

你十一百一十一和十一

对这两个数字的二进制表示的位执行XOR,因此您对二进制数pg_dumpall11110100001010101110进行异或运算,结果为1011。有趣的是,该数字的十进制表示为11110100001010100101,这正是您对二进制数字10001011000110进行异或后得到的结果的二进制表示。

11

如果你想对二进制数Decimal Binary 1000110 == 11110100001010101110 ^ 11 == 00000000000000001011 -------------------- 1000101 == 11110100001010100101 1000110进行异或,你应该写:

11

这会给你十进制数 String lastdigits="1000110"; int overflow=3; // 11 in binary is 3 in decimal int lastdigitsint=Integer.parseInt(lastdigits,2); int result=(int) lastdigitsint^overflow; (其二进制表示为69)。