Java按位运算返回"错误"值

时间:2015-01-17 00:18:27

标签: java binary operations

---编辑:我不允许使用任何软件包或prewirtten方法。不用担心,我不想让你做我的作业",我只需要一点提示!--- 我找到了these interesting Algorithms。我想使用方法bitwiseAdd。我的问题是,左移位运算符返回的值不是二进制... 我理解算法,但我是一个初学者。所以这是"程序"。我实现了额外的输出以找到问题。我认为它必须是左移操作员。这是代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;

class Addition1
{
public static int first;
public static int second;
public static void main(String args[]) throws Exception
{

    BufferedReader userInput = new BufferedReader(newInputStreamReader(System.in));
    System.out.println("Geben sie den ersten Summanden ein!");
    first = Integer.parseInt(userInput.readLine());
    System.out.println("Geben sie den zweiten Summanden ein!");
    second = Integer.parseInt(userInput.readLine());
    bitwiseAdd(first, second);
}

public static void bitwiseAdd(int n1, int n2)
{
    int x = n1, y = n2;
    int xor, and, temp;
    and = x & y;
    xor = x ^ y;
    System.out.println("x: " + x);
    System.out.println("y: " + y);
    System.out.println("and: " + and);
    System.out.println("xor: " + xor);
    System.out.println("Schleife:");
    while (and != 0)
    {
        and <<= 1;
        System.out.println("and <<= 1: " + and);
        temp = xor ^ and;
        System.out.println("temp = xor ^ and: " + temp);
        and &= xor;
        System.out.println("and &= xor: " + and);
        xor = temp;
        System.out.println("xor = temp: " + xor);
    }
    System.out.println("Ergebnis: " + xor);
}
}

以下是n1 = 1001和n2 = 1101的程序输出(+注释):

Geben sie den ersten Summanden ein! (means: type in first value)
1001
Geben sie den zweiten Summanden ein! (means: type in second value)
1101
x: 1001
y: 1101
and: 73 (java might interpret x and y as non binary)
xor: 1956
Schleife: (means: loop)
and <<= 1: 146
temp = xor ^ and: 1846
and &= xor: 128
xor = temp: 1846
and <<= 1: 256
temp = xor ^ and: 1590
and &= xor: 256
xor = temp: 1590
and <<= 1: 512
temp = xor ^ and: 1078
and &= xor: 512
xor = temp: 1078
and <<= 1: 1024
temp = xor ^ and: 54
and &= xor: 1024
xor = temp: 54
and <<= 1: 2048
temp = xor ^ and: 2102
and &= xor: 0
xor = temp: 2102
Ergebnis: 2102 (means: result)

我会很高兴有任何帮助! :) 祝你今天愉快, 皮质

3 个答案:

答案 0 :(得分:2)

程序中的值从未被解释为二进制。您实际上是在添加小数值10011101,并将它们正确地加到2102。此外,十进制10011101的二进制表示是

1001: 00000011 11101001
1101: 00000100 01001101

and时,您会得到小数73

  73: 00000000 01001001

如果您想将这些数字解释为二进制数,请在Integer.parseInt中使用2的基数,例如:

first = Integer.parseInt(userInput.readLine(), 2);

要以二进制格式输出数字,请使用Integer.toBinaryString,例如:

System.out.println("Ergebnis: " + Integer.toBinaryString(xor));

答案 1 :(得分:0)

您正在尝试在真实计算机内部的虚拟机内编写虚拟机,该虚拟机本身可能是虚拟机。难怪有混乱。

您需要将数据表示为bool(或int或char等)数组。

bool [] operand1 = new bool [8];
bool [] operand2 = new bool [8];

bool [] leftShift (bool [] operand)
{
    bool [] result = new bool [operand.length];

    for (int i=8; i>1; i++)
    {
        result[i] = operand[i-1];
    }
    return result;
}

bool [] and (bool [] operand1, bool [] operand2)
{
     int max, min;
     if (operand1.length > operand2.length) {
          max = operand1.length;
          min = operand2.length;
     }
     else {
          max = operand2.length;
          min = operand1.length;
     }
     bool [] result = new bool [max];

     for (int i = 0; i<min;i++)
     {
         result[i] = operand1[i] && operand2[i];
     }
     return result;
}

答案 2 :(得分:0)

  

我在main方法中使用了first = 1001; second = 1101; bitwiseAdd(first, second);,但程序仍然将它们解释为十进制数(这是逻辑的)。

当您在Java程序中编写文字时,文字的语法告诉Java如何解释它。

12345     // decimal
012345    // octal
0x1234    // hexadecimal
0b1001    // binary

这里没有猜测。您使用的语法告诉Java编译器。

了解更多信息:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

(唯一有点棘手的是,一个领先的非重要零意味着这个数字是八进制而不是十进制。这是一个令人遗憾的(IMO)C编程语言的结转。它确实让一些人绊倒。)

  

你知道我怎么改变它吗?

是的...如果你想在源代码中将数字表示为二进制,请使用二进制文字。


你需要彻底了解的事情是二进制/八进制/十进制/十六进制都是关于从用户(或程序员)获取数字或向其提供数字。在内部,它们都变成了同样的东西。 int类型(和其他整数类型)是不可知的十进制,二进制等等。只有一种类型,int上的算术运算符和按位运算符只有一种含义。