Java - Contar posicion de cada numero que sea igual.

 
Vista:
sin imagen de perfil

Contar posicion de cada numero que sea igual.

Publicado por José Alberto (4 intervenciones) el 25/07/2017 23:23:19
Hola gente, que tal.
Tengo el siguiente codigo, su funcion es que pide un numero hexadecimal, despues otro y al final lo convierte cada una a binario.
Pero ahora se me ocurrio contar la cada posicion de cada '1' que salga en cada cadena, por ejemplo, de la cadena "01110010001101000000010101000001" mostrar las posiciones asi: "2,3,4,7,11,12,14,22,24,26,32", que vendria siendo la posicion de cada numero 1.

Si no esta bien explicado pido una disculpa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package examenbitmap;
import java.io.*;
import java.lang.*;
 
public class ExamenBitmap {
 
    public static void main(String[] args) throws IOException
    {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
 
        System.out.println("Ingrese el bit primario: ");
        String hex = bf.readLine();
 
 
       System.out.println("Ingrese el bit secundario: ");
 
       String hexa = bf.readLine();
 
        int y = Integer.parseInt(hex,16);
        int x = Integer.parseInt(hexa,16);
 
        String bin = Integer.toBinaryString(y);
        String binx= Integer.toBinaryString(x);
 
        System.out.println("El valor del bitmap primario es: "   + bin);
        System.out.println("El valor del bitmap secundario es: " + binx);
 
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jose
Val: 130
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Contar posicion de cada numero que sea igual.

Publicado por Jose (46 intervenciones) el 26/07/2017 01:43:39
Hola amigo.

bueno como ya tienes el string de tu número binario, solo lo tienes que recorrer e imprimir en cual posición encontraste un 1.

Ejemplo utilizando tu código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
        String bin = Integer.toBinaryString(y);
        String binx= Integer.toBinaryString(x);
 
        System.out.println("El valor del bitmap primario es: "   + bin);
        System.out.println("El valor del bitmap secundario es: " + binx);
        System.out.println("Posicion de cada uno en la cadena: "+bin);
 
      for(int i=0;i<bin.length();i++){
 
            if('1'==bin.charAt(i)){//comparas cada carácter de la cadena, 
                if(i>0){//esto impide que se imprima una coma en el primer 1 encontrado
                    System.out.print(",");
                }
               //esto imprime la posición, como estamos contando desde 0 sumamos 1.
                System.out.print(String.valueOf(i+1));
            }
        }
        System.out.println("");//imprimimos un salto de linea.
 
...

bueno con esto te bastaría, espero que te sea compresible el código.


saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Contar posicion de cada numero que sea igual.

Publicado por José Alberto (4 intervenciones) el 26/07/2017 03:30:42
Hola, muchas gracias por la ayuda, si me sirve ya solo lo mejoro porque solo me muestra 5 posiciones y estan mal.

Otra pregunta si no es mucha molesta, hay alguna forma de poner el cero a la izquierda en el numero binario? Por ejemplo, al convertir manualmente un hexadecimal empieza en 0, pero al hacerlo en el programa no los muestra, y creo que eso puede interferir al contar la posicion final, no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jose
Val: 130
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Contar posicion de cada numero que sea igual.

Publicado por Jose (46 intervenciones) el 26/07/2017 17:27:23
hola, que raro que te de mal la posición, lo probé y funciona ten en cuenta que el algoritmo inicia a contar en uno de izquierda a derecha.
y por lo que dices, de agregarle 0 a la izquierda si se puede, no se cual seria tu motivo pero si se puede.

aunque aquí se puede considerar dos situaciones:

1. mascara fija: es decir tu tienes una longitud determinada de 0 para tu número binario, si la cantidad de dígitos
es inferior a tu mascara se colocaran tantos 0 a la izquierda para rellenar hasta llegar a la longitud fija.
si es más grande no hay clavo se imprimirá, el número binario tal como es.

ejemplo de código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public String rellenar_a_cero(String numero_binario,String mascara){
 
	if(numero_binario.length()>mascara.length()){
		return numero_binario;
	}
	else{
		StringBuilder cadena=new StringBuilder(mascara.length());
		int cantidad_mascara=mascara.length()-numero_binario.length();
		//agrega los 0 necesarios.
		for(int i=0; i<cantidad_mascara;i++){
			cadena.append(mascara.charAt(i));
		}//fin del for
		//agrega el número
		for(int i=0;i<numero_binario.length();i++){
			cadena.append(numero_binario.charAt(i));
		}
		return cadena.toString();
	}// fin del else
 
}

...uso
1
2
String nuevo_binario=rellenar_a_cero("101","000000000");
System.out.println(nuevo_binario);

Salida: 000000101
Nota: la solución para este problema, se puede resolver con el for como te indique, con subString, con String.format, solo es que pongas a probar o lo busques por internet, que hay muchas soluciones, para este problema, por eso te di una nueva.

2. número fijo de 0.
esto es más sencillo, tu quieres que tu número siempre tenga una misma cantidad de 0 a la izquierda
por ejemplo 3 0.

así que para esto solo le concatenas estos "0" y ya.

ejemplo:
1
2
String binx= Integer.toBinaryString(x);
binx="000"+binx;//listo ahora siempre tendra 3 ceros a la izquierda.

bueno y eso es todo, nos cuenta si te sirvió la respuesta.

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Contar posicion de cada numero que sea igual.

Publicado por José Alberto (4 intervenciones) el 26/07/2017 21:27:46
Muchas gracias José, todo me fue de mucha ayuda.

Anoche mi codigo hacia lo que quería, pero hoy al intentar hacer las mismas pruebas me marca un error, podrias ayudarme?

Mi codigo es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package examenbitmap;
import java.io.*;
import java.lang.*;
import java.math.BigInteger;
 
public class ExamenBitmap {
 
    public static void main(String[] args) throws IOException
    {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
 
        System.out.println("Ingrese el bit primario: ");
        String hex = bf.readLine();
 
        String valorBigInt=hexToBinary(hex);
        String valorBigInt32=String.format("%16s", valorBigInt).replace(" ", "0");
 
        System.out.println("El valor del bitmap primario es: "   + valorBigInt32);
 
        System.out.println("Posicion de cada uno en la cadena: ");
 
        for(int i=0;i<valorBigInt32.length();i++){
            if ('1'==valorBigInt32.charAt(i)) {
                if (i>0){
                    System.out.print(",");
                }
                System.out.print(String.valueOf(i+1));
            }
        }
            System.out.println("");
    }
    public static String hexToBinary(String hex)
    {
        return new BigInteger(hex, 16).toString(2);
    }
}

El error que me sale es el siguiente:

Exception in thread "main" java.lang.NumberFormatException: For input string: " B238"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:569)
at java.math.BigInteger.<init>(BigInteger.java:470)
at examenbitmap.ExamenBitmap.hexToBinary(ExamenBitmap.java:34)
at examenbitmap.ExamenBitmap.main(ExamenBitmap.java:15)
C:\Users\MoNiCa\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 4 seconds)


Muchas gracias por tu ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Jose
Val: 130
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Contar posicion de cada numero que sea igual.

Publicado por Jose (46 intervenciones) el 26/07/2017 23:29:11
Hola.
me alegro que la ayuda te este sirviendo.
el error como te lo menciona el mensaje de error es que no puede parsear el cadena " B238", y te preguntaras porque?, la razón es porque tienes un espacio en blanco al inicio de tu cadena. pondré una X remplazando el espacio en blanco para que lo veas "XB238".

Esto es porque la cadena debe ir bien escrita, sin caracteres extraños adicionales, citando las indicaciones de la documentación de BigInteger
The String may not contain any extraneous characters (whitespace, for example).

bueno como lo solucionas?, fácil con el método trim de la clase String (lo que hace es eliminar los espacios en blanco a la izquierda y derecha de la cadena).

1
2
3
4
5
6
public static String hexToBinary(String hex)
{
	hex=hex.trim();
 
	return new BigInteger(hex, 16).toString(2);
}

te sugiero que valides la cadena de entrada, por ejemplo un try catch, te puede ayudar. a que tu programa no se cuelgue cuando la cadena no tiene el formato correcto. y podes sacar un bonito mensaje al usuario.
Esto de manejo de errores te lo dejo de tarea.

saludos.

pd:
*link de la documentación de big int
https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html
*como sugerencia siempre revisa la documentación de las clases del api de java que utilices, créeme que te libraras de varios dolores de cabeza por usar incorrectamente, o no saber el alcance de un metodo o una clase.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar