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!