Contar los bits necesarios para representar un número en Java
¡Hola! Seguimos con los snippets en Java. Voy a enseñaros cómo contar el número de bits que necesita un número para ser representado. Crearé varias funciones que tendrán como parámetro de entrada un entero y como variable de salida (return) el resultado, también entero.
Por ejemplo:
Número decimal | Número binario | Bits necesarios |
---|---|---|
2 | 10 | 2 |
3 | 11 | 2 |
14 | 1110 | 4 |
Una vez sabemos lo que debemos obtener de las funciones, vamos a pasar a desarrollarlas. En la primera trabajaremos a nivel de bit para que sea más rápido. Esto quiere decir que no vamos a estar dividiendo entre 2 con la operación de toda la vida, sino que vamos a desplazar bits a la derecha. Por ejemplo:
Número decimal | Número binario | Número decimal desplazado | Número binario desplazado |
---|---|---|---|
2 | 10 | 1 | 01 |
3 | 11 | 1 | 01 |
14 | 1110 | 7 | 0111 |
Para desplazar 1 bit a la derecha utilizaremos el operador '>> 1' y para desplazar 1 a la iquierda '<< 1'. Mientras el número sea mayor que 0, seguiré dividiendo. Es el proceso de pasar de binario a decimal, pero en lugar de obtener el número decimal, cuento las veces que tengo que dividir. La función quedaría así:
int cuentaBits(int numero) { int bits_necesarios = 0; while(numero > 0) { bits_necesarios++; numero = numero >> 1; // Desplazo bits (división por 2) } return bits_necesarios; }
Ejemplo de uso:
public class ContarBits { static int cuentaBits(int numero) { int bits_necesarios = 0; while(numero > 0) { bits_necesarios++; numero = numero >> 1; // Desplazo bits (división por 2) } return bits_necesarios; } public static void main(String[] args) { int numero1 = 2, numero2 = 3, numero3 = 14; System.out.println("Bits necesarios para "+numero1+"-> "+cuentaBits(numero1)); System.out.println("Bits necesarios para "+numero2+"-> "+cuentaBits(numero2)); System.out.println("Bits necesarios para "+numero3+"-> "+cuentaBits(numero3)); } }
Ahora otra función. Esta vez utilizaremos la clase Integer:
int cuentaBits(int numero) { return Integer.SIZE - Integer.numberOfLeadingZeros(numero); }
Ejemplo de uso:
public class ContarBits { static int cuentaBits(int numero) { return Integer.SIZE - Integer.numberOfLeadingZeros(numero); } public static void main(String[] args) { int numero1 = 2, numero2 = 3, numero3 = 14; System.out.println("Bits necesarios para "+numero1+"-> "+cuentaBits(numero1)); System.out.println("Bits necesarios para "+numero2+"-> "+cuentaBits(numero2)); System.out.println("Bits necesarios para "+numero3+"-> "+cuentaBits(numero3)); } }
La salida en ambos programas es:
Bits necesarios para 2-> 2 Bits necesarios para 3-> 2 Bits necesarios para 14-> 4
Espero que os sirva este tutorial. ¡Un saludo!