Calculadora Binaria

Necesito hacer un menú que de las opciones suma, resta, and, or y salir, que permita ingresar por teclado dos numeros decimales y los convierta a binarios, para que en binario realice la opción seleccionada del menu anterior y mostrar en pantalla el resultado en binario. No debo utilizar funciones nativas de Java.
Soy nueva programando y lo único que llevo de código es el menú de las opciones hasta solicitar el ingreso de los números en decimal, pero ya me atore, no encuentro ningun ejemplo de código que me ayude a entender como hacerlo, ya que la mayoria utiliza funciones nativas de Java.
Pienso que una vez capturados los números decimales, debo convertirlos a binario y luego realizar la operación seleccionada por el usuario.
Me podrían ayudar, se que en este foro todos son expertos menos yo.......

AdjuntoTamaño
Dudas.pptx222.84 KB

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Sabes hacerlo con papel y

Sabes hacerlo con papel y lapiz?
Es decir si tienes:

0111
+
0001
--------
????

Si no lo sabes, empieza por ahí. Si lo sabes trata de describir los pasos que necesitas dar. Forma un algoritmo con eso y luego lo implementas.

No está claro que tanto tienes que hace pero lo "binario" es solo una representación. Si tu capturas un numero y lo muestras como binario aún puedes hacer operaciones dentro del programa:

int a = Integer.parseInt( "0111", 2 );
int b = Integer.parseInt("0001", 2);
int c = a + b;
String resultado = Integer.toString( c, 2 );

Pero no sé si estás considerando como "nativa" el usar la suma aritmética o no.

Saludos.

p.d. Ahí tienes ya dos muy buenos "hints" para transformar de y hacia binario en Java y no es necesario que subas todo un powerpoint para el screenshot, puedes subir el png directamente

Gracias por tu respuesta

Gracias por tomarte la molestia de contestarme, ya leí sobre como hacerlo con papel y lapiz, también lo hice en excel pero en el codigo no puedo usar integer.parseInt ni integer.tobinaryString.
Y la verdad he encontrado escasa información sobre como hacerlo sin usarlos, sobre todo cuando el número decimal sea negativo.

Imagen de neko069

Sin String

Si no puedes usar el método que te dice Oscar, vas a tener que hacer las divisiones (en el caso de la conversión de decimal a binario) y los residuos concatenarlos en un String, y para la conversión de binario a decimal, vas a tener que usar el String resultante como arreglo, y sumar las posiciones, o sea, lo más cercano a hacerlo a lápiz y papel.

Y como lo haces en lápiz y

Y como lo haces en lápiz y papel?
Si escribes los pasos acá yo te puedo escribir el pseduo código y luego impleemntarlo de ahí es fácil .

Saludos.

Imagen de Jose Manuel

Yo te ayudo con dos cosas

Yo te ayudo con dos cosas ;)
La conversión de decimal-binario y la suma de números binarios.
Primero veamos que dice la teoría sobre la conversión:
Se divide el número del sistema decimal entre 2, cuyo resultado entero se vuelve a dividir entre 2, y así sucesivamente hasta que el dividendo sea menor que el divisor, 2. Es decir, cuando el número a dividir sea 1 finaliza la división.
Según Wikipedia.

Y para realizar una suma binaria la teoría dice que hay que basarnos en la siguiente tabla:
Tabla para sumar:

  • 0 + 0 = 0
  • 0 + 1 = 1
  • 1 + 0 = 1
  • 1 + 1 = 10

Entonces, el código resultante puede ser:

/**
 *
 * @author Kalt Wulx
 */

public class ConversorBinario {

    public static void main(String args[]) {
        System.out.println("Convertir a binarios");
        int[] test1 = decimalToBinary(4444);
        int[] test2 = decimalToBinary(36843);
        System.out.println("Valores convertidos y rellenados:");
        for (int item : test1) {
            System.out.print(item);
        }
        System.out.println();
        for (int item : test2) {
            System.out.print(item);
        }
        System.out.println();
        System.out.println("Resultado de la suma binaria");
        int res[] = sumBinAndBin(test1, test2);
        for(int i = 0; i < res.length; i++) {
            System.out.print(res[i]);
        }
        System.out.println();
    }

    public static int[] decimalToBinary(int numeroDecimal) {
        //Variables locales
        int residuo = 0;
        String res = "";
       
        //mientras el resultado de la division sea mayor que 0
        while (numeroDecimal > 0) {
            residuo = numeroDecimal % 2;//obtener el residuo
            numeroDecimal = numeroDecimal / 2;//realizar la siguiente division
            //En el orden natural de la operacion los valores estan invertidos
            //por eso aqui los volvemos a invertir :)
            res = residuo + res;
        }
        System.out.println(res);
        //El contenido maximo en una variable de tipo entero es 2**31-1
        //Por eso es logico que el max numero binario en un entero sea 2**31-1 = 2147483647
        int resultado [] = new int[31];
        //Para que la manipulacion del numero binario sea mas simple
        //lo convertimos en un arreglo. Pero, como el maximo valor esta dado
        //por 2**31-1 y eso son 31 posiciones debemos introducir ceros a la izq del valor binario
        for(int i = resultado.length -1, j=0, k=0; i > -1; i--, j++) {//Recorremos el arreglo
            //Si el valor de i(indice inverso) es mayor o igual a la longitud de
            //la cadena (la que contiene el numero binario).
            //Entonces aun no llegamos a las posiciones para la cadena.
            if(i >= res.length()) {
                resultado[j] = 0;//Y rellenamos esos espacios con 0
            } else {
                //Cuando lleguemos a los espacios que ocupa la cadena
                //los agregamos en orden inverso con la ayuda de k
                //mientras los parseamos a enteros ;)
                resultado[j] = Integer.parseInt(res.charAt(k)+"");
                k++;//incrementamos k
            }
        }
        return resultado;//Al finalizar el ciclo retornamos el arreglo.
    }
   
    /*
     * Suma dos numeros binarios.
     * Recibe dos arreglos de tipo entero y retorna un
     * arreglo de tipo entero con el resultado de la suma.
     */

    public static int[] sumBinAndBin(int a[], int b[]) {
        int acarreo = 0;//variable de control.
        int[] c = new int[a.length];//Arreglo a retornar.        
        //Se recorre el arreglo a de manera inversa.
        for (int i = a.length - 1; i > -1; i--) {            
            int suma = a[i] + b[i]; //Se realiza  la suma una vez por ciclo
            if(suma == 2) {//Si la suma da 2 los elementos en el arreglo son 1 y 1.
               c[i] = 0;//Por lo tanto debe ir como resultado un 0
               acarreo = 1;//Y se lleva un acarreo
           }
            //Si por el contrario la suma es 0 quiere decir que los elementos
            //eran 0 y 0.
            else if(suma == 0) {
               c[i] = 0;//Entonces debe ir 0 como resultado
           }
            //Si por el contrario la suma es 1, entonces los elementos
            //eran 0 y 1 o viceversa.
            else if(suma == 1) {
               c[i] = 1;//Y debe ir como resultado un 1.
           }
           if(acarreo == 1) {//Si existe un acarreo en este ciclo
               //Se comprueba si la suma del elemento siguiente del
               //arreglo "a" mas el acarreo es igual a 2.
               if(a[i-1] + 1 == 2) {
                   a[i-1] = 0;//Si lo es, se asigna un 0 a "a".
                   acarreo = 1;//Y se sigue llevando un acarreo.
               } else {//Si la suma no da 2, solo puede dar 1.
                   a[i-1] = 1;//Y entonces se asigna 1 a "a".
                  acarreo = 0;//Y el acarreo desaparece.
               }
           }
        }
        return c;//Se regresa el arreglo.
    }
}

Y con eso obtienes el resultado de la suma de dos números binarios. Para ver el resultado falta hacer el método que convierta un numero binario a decimal ;) o puedes buscar paginas web que hagan esto ultimo para verificar resultados. Ya solo faltan la resta, división, multiplicación y convertirlos a decimal >_<.
Lo esencial es comprender la teoría después puedes pasarlo a código. Como ya dijo Oscar, si se te dificulta puedes preguntar :)

Me gustaría saber si alguien tiene alguna forma mas "pro" de hacer la suma. Yo estaba intentando con una pero nomas no me salio.
Saludos!

Imagen de Sr. Negativo

Binario a decimal

Ya le ayudaste mucho JoseManuel asi que yo también (jeje) aqui va el de decimal a binario.
Prog03.java

/*
Decimal a binario*/

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JOptionPane;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.*;
import javax.swing.*;
import java.lang.String.*;
import java.awt.Color;
//import java.net.URL;

public class Prog03 extends JFrame{
final private JTextField txtDecimal;
private JButton btnActiva;
private JButton btnSalir;

   public Prog03(){

   JLabel lblImg= new JLabel(new ImageIcon(Prog03.class.getResource("SRN4.jpg")));
   
   JLabel lblDecimal= new JLabel("<html><font color='red'><b>Número decimal:</b></font></html>");
   
   txtDecimal=new JTextField(6);
   txtDecimal.setToolTipText("introducir solo números enteros");

   JPanel panel=new JPanel();  
   panel.add(lblImg);
   panel.add(lblDecimal);
   panel.add(txtDecimal);

 
   btnActiva= new JButton("<html><font color='white'><b>Convertir</b></font></html>",new ImageIcon("SRN4.jpg"));
  btnActiva.setToolTipText("obtener número binario");
  btnActiva.setBackground(Color.blue);
   btnActiva.addActionListener(new ActionListener()
   {
     
      public void actionPerformed(ActionEvent e) {
         

        System.out.println("Número decimal leído:"+txtDecimal.getText()+"   Numero binario obtenido :"+convertir(txtDecimal.getText()));
//JOptionPane.showMessageDialog(null,"Numero binario obtenido:"+convertir(txtDecimal.getText()),JOptionPane.INFORMATION_MESSAGE,new ImageIcon("SRN4.jpg"););

 JOptionPane.showMessageDialog(null," Número binario obtenido:\n"+convertir(txtDecimal.getText()), "Resultado", JOptionPane.WARNING_MESSAGE, new ImageIcon("SRN4.jpg"));
        limpia();

      }

  });

  btnSalir= new JButton("<html><font color='yellow'><b>Salir</b></font></html>",new ImageIcon("SRN4.jpg"));
  btnSalir.setToolTipText("quitar ahora");
  btnSalir.setBackground(Color.red);
  btnSalir.addActionListener(new ActionListener()
   {
     
      public void actionPerformed(ActionEvent e) {
         

        System.exit(0);

      }

  });

   panel.add(btnActiva);panel.add(btnSalir);

   setTitle("[Decimal a Binario]");
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setDefaultLookAndFeelDecorated(true);
   setSize(600,230);
   setVisible(true);
   add(panel);

  }
   

  public static void main(String ... args)throws Exception{
   
       
        for(UIManager.LookAndFeelInfo laf:UIManager.getInstalledLookAndFeels()){
          if("Nimbus".equals(laf.getName()))
        try {
                UIManager.setLookAndFeel(laf.getClassName());
                        //UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" ) ;
                    //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
           
                        new Prog03();
     
           
                }
                catch (ClassNotFoundException e) {
                        System.out.println("[Main.main:ClassNotFoundException]"+ e.getMessage());
                }
                catch (InstantiationException e) {
                        System.out.println("[Main.main:InstantiationException]"+ e.getMessage());
                }
               
        }
       
   
   

  }
 

 
// limpiar
public void limpia(){
   txtDecimal.setText("");

}

public StringBuffer convertir(String cade){
       
       int resto=0;
int numeroDecimal=Integer.parseInt(cade);
String numeroBinario="";
while(numeroDecimal>=2){
  resto=numeroDecimal%2;
  numeroDecimal=(int)numeroDecimal/2;
  numeroBinario+=String.valueOf(resto);
}
numeroBinario+=numeroDecimal;
StringBuffer sb = new StringBuffer(numeroBinario);
return sb.reverse();

}

}

En ejecución:

Imagen de Jose Manuel

Sr - pero el decimal-binario

Sr - pero el decimal-binario ya lo puse :P bueno seria poner el binario-decimal. Y por el titulo de tu mensaje creo que si pensabas hacer el binario a decimal. Creo que al ultimo confundiste la conversión :O

Imagen de Sr. Negativo

Era decimal a binario

jajajaja
Ya lei bien el título me confundi

Imagen de genitalico

que ondas como ya vi los

que ondas como ya vi los codigos arriba me anime hacer uno.. es una clase con dos metodos.. un convierte de Decimal a binario, octal y hexadecimal
y el otro metodo convierte de binario a decimal, aun que con algunos ajustes que haber si hago despues podra convertir de cualquier base a decimal..

tiene algunos bugs, el metodo que convierte decimal a X base se le ponen en el metodo una base mayor a 16 sacara las letras de los hexadecimal al encontrar residuos de 10, 11, 12,13,14,15
y el otro metodo solo convierte binario a decimal, aun que como dije con algunos ajustes podra con cualquier base..
haber si luego hago las sumas binarias.

pero ya le dejamos bastante ayuda a grillitos

public class ConversionBases
{
        private String conversion;
        private String conversion2;
       
        public void setDecimalBase(int numero,int base)
        {
                StringBuilder btemp = new StringBuilder();
                int residuo = 0;
                conversion = "";
                boolean detec = true;
               
                String[] hex = new String[]{"A","B","C","E","F"};
               
                while(numero !=0)
                {
                        detec = true;
                        residuo = (numero%base);
                        for(int i=10;i<16;i++)
                        {
                                if(residuo==i)
                                {
                                        btemp.append(hex[i-10]);
                                        detec = false;
                                        break;
                                }
                        }
                        if(detec)
                        {
                                btemp.append(residuo);
                        }
                       
                        numero = (int)(numero/base);
                       
                }
                conversion = btemp.reverse().toString();
        }
       
       
        public void setBaseDecimal(String numero,int base)
        {
                conversion2 = "";
                int tmpnumero = 0;
                StringBuilder tmp = new StringBuilder();
                tmp.append(numero);
                numero = tmp.reverse().toString();
                for(int i=0;i<numero.length();i++)
                {
                        tmpnumero +=(Integer.parseInt(String.valueOf(numero.charAt(i)))*
                                        (int)(Math.pow(base,i)));
                }
                conversion2 += tmpnumero;
        }
       
        public String getDecimalBase()
        {
                return conversion;
        }
       
        public String getBaseDecimal()
        {
                return conversion2;
        }

}

Aqui esta la prueba..

public class Main
{
       
        public static void main(String[]args)
        {
                ConversionBases d = new ConversionBases();
                int numero = 255;
                d.setDecimalBase(numero,2);
               
                System.out.println(d.getDecimalBase());
               
                d.setBaseDecimal(d.getDecimalBase(), 2);
                System.out.println(d.getBaseDecimal());
               
        }

}

Imagen de Sr. Negativo

+10 conversionesBases

@genitalico

Muy buen aporte (@Grillitos ya no tiene excusa de que no le ayudamos jeje es broma)

0_o

Imagen de genitalico

jaja si claro ya le hicimos

jaja si claro ya le hicimos casi todo xD aun faltan las operaciones binarias pero bueno..

como hacer una division binaria en java, con todos los procesos?

necesito hacer una division binaria sin utilizar metodos y funciones, esta un poco complicado