2017-07-11 8 views
-2

私は、Javaと、この時間は私が
1.改宗2つのバイナリ番号が
2.バイナリにし、中にこれらの2進数の和
3.ショー結果の両方を計算し小数に、プログラムを作っていた練習していました10進数
私はコード内で効率的な方法を行っていないことを知っていますが、それは目的に沿ったものです。
(だから私は1つのプロジェクトだけでもっと練習することができます)
しかし、それは
を小数に バイナリから変換しようとしたとき、それは常に「3」として最初の数秒を表示することを私のコードで問題があります「 」を「2」とする。
誰かが私が間違っていることを教えてもらえますか?前もって感謝します。
(私はすでにインターネット上で答えを探してみましたが、私はそれを見つけることができませんでした
申し訳ありませんが、私はダムのミスで、あなたの時間を無駄にしています。。)「ForEach」ループを正しく使用するにはどうすればよいですか?

package binary2decimal2binary; 
import java.util.Scanner; 
import java.util.ArrayList; 

public class Binary2Decimal2Binary { 
private static long binary1; 
private static long binary2; 
private final static ArrayList POWERSOF2 = new ArrayList<Integer>(); 
private final static ArrayList<Integer> SEPARATED2 = new ArrayList<Integer>(); 
private static int temp1 = 0; 
private static int result1 = 0; 
private static int temp2 = 0; 
private static int result2 = 0; 
private final static ArrayList<Integer> SEPARATED1 = new ArrayList<Integer>(); 



static void binary2ArrayList(long binary1, long binary2){ 
String separating1 = String.valueOf(binary1); 
System.out.println("Debugger 1 :" + separating1); 
for(int i = 0; i < separating1.length(); i++) { 
    int j =(int) Character.digit(separating1.charAt(i), 10); 
    SEPARATED1.add(j);} 
String separating2 = String.valueOf(binary2); 
System.out.println("Debugger2 :" + separating2); 
for(int x = 0; x < separating2.length(); x++) { 
    int y =(int) Character.digit(separating2.charAt(x), 10); 
    SEPARATED2.add(y); 
} 
Arraylist2Decimal(); 

} 



static void Arraylist2Decimal(){ 

    for(Integer intValue : SEPARATED1){ 
    int i = 0; 
    temp1 = (int) SEPARATED1.get(i); 
    if(temp1 == 1){ 
     result1 = (int) POWERSOF2.get(i) + result1; 

    } 
    i += 1; 
    System.out.println("Debugger 3:" + i); 
    } 

    for(Integer intValue: SEPARATED2){ 
    int k = 0; 
    temp2 = (int) SEPARATED2.get(k); 
    if(temp2 == 1){ 

    result2 = (int) POWERSOF2.get(k) + result2; 

    } k += 1; 
    System.out.println("Debugger 4:" + k); 
      } 
}; 



    public static void main(String[] args) { 
     POWERSOF2.add(1); 
     POWERSOF2.add(2); 
     POWERSOF2.add(4); 
     POWERSOF2.add(8); 
     POWERSOF2.add(16); 
     POWERSOF2.add(32); 
     POWERSOF2.add(64); 
     POWERSOF2.add(128); 
     POWERSOF2.add(256); 
     POWERSOF2.add(512); 
     POWERSOF2.add(1024); 
     POWERSOF2.add(2048); 
     POWERSOF2.add(4096); 
     POWERSOF2.add(8192); 
     POWERSOF2.add(16384); 
     POWERSOF2.add(32768); 

     Scanner scan = new Scanner(System.in); 

System.out.println("Input first binary number."); 
binary1 = scan.nextLong(); 
System.out.println("Input second binary number."); 
binary2 = scan.nextLong(); 
scan.close(); 
binary2ArrayList(binary1,binary2); 

System.out.println("First Number Converted:" + result1); 
System.out.println("Second Number Converted:" + result2); 



    } 



} 

編集:私はいくつかのコードを追加しました私のループで何が起こっているのか確認してください。 と変なことが起こっていました。
INPUT:
OUTPUT:
デバッガ1:101
Debugger2:10
デバッガ3:1
デバッガ3:1
デバッガ3:1
デバッガ4:1
デバッガ4:1
最初の変換番号:3
2番目の変換番号:2
私は
i + = 1を追加しましたが、および
k + = 1;ループでは値は決して
に上がることはありません。私を助けてください。

+0

Integerは既に定義済みのクラスなので、無効な変数名です。 –

+0

@ CardinalSystemこれは当てはまりません。それを試してみてください。 Javaは 'Integer'という名前の変数を宣言します。 – ajb

+0

それは愚かなO.o –

答えて

0

ここにはいくつかの改善が必要なものが実際にたくさんあります。

  • Java 1.5以降では、Genericsです。できるだけの生のタイプArrayListの代わりにArrayList<Integer>)を使用してください。あなたの変数(すなわちList<Integer> list = new ArrayList<Integer>();代わりにArrayList<Integer> list = new ArrayList<Integer>();)を定義するとき

  • むしろ実装よりインターフェイスを使用します。

  • staticキーワードを過剰に使用しないでください。クラスやカプセル化のようなOOPの概念を利用する。長期的に望ましくない副作用を防止します。

  • privatefinalを可能な限り多くのフィールドに追加してください。これは、再割り当てや他のクラスがそれらと無関係なときにそれらの値にアクセスするのを防ぎます。

  • あなたはforループを改善する必要があります: for(Type element : Iterable)は、すでにそのiterableの要素を提供しています。そのループ内でseparated1.get(i)を呼び出すことは意味がありません(iは常に0なので)。単一の要素はすでにelementでアクセスできるためです。一緒にすべてを置く

、あなたのコードは次のようになります。

.... 

private final List<Integer> separated2 = new ArrayList<Integer>(); 

.... 

for(Integer intValue : separated2) { 
    // your logic using intValue 
    .... 
} 

EDIT:伝統forループと同等の例は次のようになります。

private final List<Integer> separated2 = new ArrayList<Integer>(); 

.... 

for(int i = 0; i < separated2.size(); i++) { 
    Integer intValue = separated2.get(i); 
    // your logic using intValue 
    .... 
} 
+0

アドバイスをいただきありがとうございます。しかし、もうちょっとだけ知っておく必要があります。 「intValue」が何であるか教えてください。それはちょうどあなたが初期化したint変数か、それともArrayListのコンテンツの数ですか? – Dynami

+0

@Dynami 'intValue'はこの変数に与えた名前です。あなたは* "" 2のコレクションの中の 'intValue'という名前の各整数に対して、以下のことを行うことができます。詳細については、[このSOの質問](https://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work)を参照してください。このトピックにはかなり良い回答があります。また、私は私の答えにいくつかの情報を追加しました。 – QBrute

0

バイナリ文字列をIntegerに変換するには:

Integer.parseInt("binaryString",2); 

ここに作業コードがあります。

public static void main(String[] args) throws ParseException { 
     Scanner scanner = new Scanner(System.in); 
     System.out.println("Input first binary number."); 
     String firstBinary = scanner.next("[0-1]+"); 
     System.out.println("Input second binary number."); 
     String secondBinary = scanner.next("[0-1]+"); 

     int int1 = convertToInt(firstBinary); 
     int int2 = convertToInt(secondBinary); 

     int sum = calculateSum(int1, int2); 

     display(firstBinary, secondBinary, int1, int2); 

     System.out.println("sum is " + sum); 
    } 

    public static void display(String binary1, String binary2, int arg1, int arg2) { 
     System.out.printf("%1s10 = %2d5\n%3s10 = %4d5", binary1, arg1, binary2, arg2); 
    } 

    public static int convertToInt(String binary) { 
     return Integer.parseInt(binary, 2); 
    } 

    public static int calculateSum(int arg1, int arg2) { 
     return arg1 + arg2; 
    } 

このプログラムでは、まず2つのバイナリを入力するように求められます。これをIntegerに変換し、その合計を計算します。最終結果はコンソールに表示されます。

関連する問題