【问题标题】:XOR giving unexpected output in JAVAXOR 在 JAVA 中给出意外的输出
【发布时间】:2016-09-30 18:36:57
【问题描述】:

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

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

变量“溢出”的值为11。 当我用溢出 (=11) 对 lastdigitsint 进行异或运算时,输出应该是 1000101。但是,代码输出的是 1095。

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

【问题讨论】:

  • 你可以简化这个例子,并提供硬编码的值
  • 嗨。我是 StackOverflow 的新手,所以我还在学习这里的规则。感谢您的指导!
  • 另外,我已将代码编辑到最低限度。是的,我在 IntelliJ 中对其进行了调试,并且我确信正确的值存储在变量“lastdigits”和“overflow”中。
  • 我运行了代码并得到了1000101。这不正是你所期望的吗?
  • 您使用的不是基于 2 的数字,而是十进制的,Integer.parseInt(lastdigits) 不会返回您的想法。如果您使用的是 Java 7,那么您可以使用基于 2 的 int lastdigitsint=0b1000110; 而不是 int lastdigitsint=Integer.parseInt("1000110");。您的变量 overflow 很可能会发生同样的情况

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


【解决方案1】:

这从一开始就是错误的

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

最后一个数字的值是 1000110 - 那是 1000 万 000 所以二进制表示与您的预期相差甚远。 你想做的很简单:

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

接缝对我来说是合法的。

【讨论】:

  • 感谢您的回答。你能否解释一下为什么这个数字的二进制表示会不同? (由于此代码适用于我输入的其他二进制数,甚至是大数)。
  • 另外,我不能硬编码 lastdigitsint 的值。这只是我整个程序代码的一部分,字符串 lastdigits 是由 for 循环生成的。有没有其他方法可以给出正确的输出?
  • 问题是,你不是用 11b (3dec) 而是用 11dec (1011bin) 异或
【解决方案2】:

你不是在异或你认为你在异或的数字。

你正在用 11 异或 110 万 110

XOR 是在这两个数字的二进制表示的位上执行的,因此您正在对二进制数 111101000010101011101011 进行异或运算,从而得到 11110100001010100101。有趣的是,该数字的十进制表示是1000101,这正是对二进制数100011011 进行异或运算得到的结果的二进制表示。

Decimal     Binary

1000110  == 11110100001010101110
                               ^
     11  == 00000000000000001011
            --------------------
1000101  == 11110100001010100101

如果你想异或二进制数100011011,你应该写:

        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(其二进制表示为 1000101)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2022-11-10
    • 2016-03-11
    • 2013-07-15
    相关资源
    最近更新 更多