2014-09-15 2 views
0

Я пытаюсь создать java-программу, в которой пользователь вводит десятичное число, и затем он преобразуется в двоичный. это то, что у меня есть до сих пор, но цикл while только петли один раз и дает мне только 0, когда я вводил 8. Я знаю, что 8 в двоичном формате 1000, поэтому я не понимаю, что я делаю неправильно. Мне нужно, чтобы кодирование было простым. пожалуйста, помогите спасибоdecimal to binary java program

import java.util.Scanner; 

public class binary 
{ 
public static void main (String [] args) 
{ 
    Scanner scan = new Scanner(System.in); 

    int userNum = 0; 
    int binary = 0; 
    double newNum = 0; 
    int count = 0; 

    System.out.print("Enter a positive base 10 number: "); 
    userNum = scan.nextInt(); 
    System.out.println(); 

    for(; (Math.pow(2,count) <= userNum); count++) 
    { 

    } 

    while(!(count == 0)) 
    { 
     if(userNum/Math.pow(2,count) != 0) 
     { 
      binary = userNum/(int)Math.pow(2,count); 
      System.out.print(binary); 
     } 

     userNum %= Math.pow(2,count); 
     count--; 
     userNum %= (int)Math.pow(2,count)); 
    } 
} 
} 

ответ

2

Вы не должны заново изобретать колесо, использовать Integer.toBinaryString(int) и что-то вроде,

Scanner scan = new Scanner(System.in); 

System.out.print("Enter a positive base 10 number: "); 
if (scan.hasNextInt()) { 
    int userNum = scan.nextInt(); 
    System.out.printf("%d decimal is %s binary%n", userNum, 
      Integer.toBinaryString(userNum)); 
} 

Кроме того, классы Java должны начинаться с заглавной буквы. Таким образом, ваш binary должен быть Binary. Наконец, если вам нужно преобразовать из двоичного в десятичный, вы можете использовать Integer.parseInt(String, 2).

+0

Это полезная функция, но это всегда хорошо, чтобы знать, как работают вещи под капотом - в этом случае, как база работает преобразование. – jackarms

+0

@jackarms По крайней мере, это полезно для проверки результата. –

0

Вы можете использовать логику, как показано ниже:

package com.java2novice.algos; 

public class DecimalToBinary { 

public void printBinaryFormat(int number){ 
    int binary[] = new int[25]; 
    int index = 0; 
    while(number > 0){ 
     binary[index++] = number%2; 
     number = number/2; 
    } 
    for(int i = index-1;i >= 0;i--){ 
     System.out.print(binary[i]); 
    } 
} 

public static void main(String a[]){ 
    DecimalToBinary dtb = new DecimalToBinary(); 
    dtb.printBinaryFormat(25); 
} 
} 
0

Вы только что получили:

for(userNum = userNum; (Math.pow(2,count) <= userNum); count++) 
{ 

} 

Вместо:

for(userNum = userNum; (Math.pow(2,count) <= userNum); count++){ 
while(!(count == 0)) 
{ 
    if(userNum/Math.pow(2,count) != 0) 
    { 
     binary = userNum/(int)Math.pow(2,count); 
     System.out.print(binary); 
    } 

    newNum = userNum%Math.pow(2,count); 
    count--; 
    userNum = (int)(newNum%(int)Math.pow(2,count)); 
}} 
} 
} 

В основном вы опустел, если.

0

Пара вопросов:

count Ваш будет всегда начинать один слишком высоко, так как последняя часть цикла for будет прирастить его снова.

Нужно, чтобы цикл while выполнялся, когда count равен 0, чтобы проверить последний бит.

Осталось, что это должно быть хорошо, но я не понимаю, что означают выражения с помощью newNum.

Простая версия вашего алгоритма заключается в использовании побитовых операторов - вместо того, чтобы делиться по степеням двух явно с помощью Math.pow, вы можете использовать побитовые операторы для проверки того, включены ли биты или нет, а затем распечатать 1 и 0 соответственно. Например:

public static void toBinary(int n) { 
    int mask = 1, nn = n; 
    while(nn != 0) { 
     mask << 1; 
     nn /= 2; 
    } 
    mask >>= 1; 

    while(mask != 0) { 
     System.out.print((mask & n) ? "1" : "0"); 
     mask >>= 1; 
    } 
} 

EDIT: Кроме того, ваш userNum = userNum является излишним в цикле for. Просто используйте нулевой оператор (;) вместо этого в части назначения цикла. Итак:

for(; (Math.pow(2, count) <= userNum); count++) {