Revista Tecnología

Bailando con bits III. Mostrando el valor binario de un número [bash, C, C++, PHP, Java, Python, Ruby]

Publicado el 28 diciembre 2015 por Gaspar Fernández Moreno @gaspar_fm

Bailando bits III. Mostrando valor binario número [bash, C++, PHP, Java, Python, Ruby]Bailando con bits III. Mostrando el valor binario de un número [bash, C, C++, PHP, Java, Python, Ruby]

De todos es sabido que un ordenador, internamente trabaja con ceros y unos, simplemente eso, a partir de ese simple valor, verdadero o falso, abierto o cerrado, existe o no existe es capaz de formar sonidos, imágenes, textos y cualquier cosa que podamos imaginarnos.

Aunque no vamos a hacer algo tan complicado, muchas veces puede que tengamos un valor entre manos y queramos saber qué bits hay a uno y qué bits hay a cero aunque sólo sea para verificar que una operación se está realizando como debe o porque estamos aprendiendo a utilizar este sistema de numeración y queremos verificar que todo nos sale bien.

En este post, voy a poner algunos métodos que podemos utilizar en varios lenguajes de programación, o en consola, con este propósito.

Decimal a binario en consola

Empecemos en consola. Vamos a utilizar dos formas, una utilizando perl (en realidad nos valdría cualquier lenguaje en el que podamos hacer un script, como awk; aunque en perl lo he visto muy sencillo):

Pocas implementaciones de printf incluyen %b para mostrar un número en base2, pero en perl podemos usar números de hasta 18446744073709551615 (64 bits), sin problema. Podríamos recoger el número en una variable así:

Parece que hacemos algo raro con las comillas, y es que $numero será una variable de nuestro interprete de consola (en mi caso Bash) y no de perl. Otra opción que tenemos es:

Podemos hacerlo como queramos.

Otra opción es utilizar el programa bc, en el que no tendremos en principio restricción del número de bits, todo puede ser que tu ordenador se tire media hora calculando bits, pero él puede con lo que le eches:

O si lo preferimos con una variable:

Lo importante aquí es obase en el que decimos la base que queremos como salida de las operaciones de bc. En realidad con bc podemos hacer muchas más cosas (sumas, restas, multiplicaciones, divisiones, raíces, senos, cosenos, logaritmos, incluso sencillos programas de lógica.

C

Vale, mi lenguaje favorito, lo dejo para el segundo. Es verdad que en algunas implementaciones de la biblioteca estándar de C, la función printf incluye un indicador de formato %b (para binario, como el ejemplo de perl de antes), pero no es lo normal. Así que si queremos sacar el valor en binario de un número, tendremos que hacerlo a mano, para ello, tengo aquí una función a mano (podemos meterla en un archivo sacabits.h e incluirlo en nuestro proyecto:

Ahora, hacemos un programa de ejemplo:

O incluso podemos sacar en binario cosas más complejas, como un struct completo (eso sí, si el struct es muy grande, la salida será enorme:

Con esto podemos aprender cosas muy curiosas sobre la memoria de un ordenador, o de cómo organiza C las cosas.

C++

Vamos avanzando, y es que en C++ tenemos métodos mucho más sencillos de sacar un valor en bits de una variable. Utilizando bitset, incluido en std. De la siguiente forma:

Java

Venga, también lo haremos en Java en este post. En este caso, de forma sencilla, cogemos un entero y lo pasamos a binario:

Integer.toBinaryString(numero) nos devolverá una cadena de caracteres con cada uno de los bits del número en cuestión.

PHP

Como sabéis que me gusta PHP, también quiero dejar un pequeño código en este lenguaje, aunque es lo más simple del mundo, ya que tenemos una función que nos saca directamente el valor en base2 de un número decimal:

Python

Python, como siempre, tiene cosas muy masticadas, y desde aquí podemos ver un ejemplo desde la línea de comandos de python:

Con el primer método, mucho más rápido veremos el valor en binario, pero con la base delante (0b), de la misma forma que podemos expresar un número en diferentes bases. Con la segunta forma, veremos directamente el valor en base 2, depende de nuestras necesidades escoger uno u otro.

Ruby

Ruby no es mi punto fuerte, pero también quería poner un ejemplo en este lenguaje. Podemos hacerlo de varias formas, entre otras, estas dos me parecen muy interesantes:

y

Ahora os toca a vosotros, ¿algún otro lenguaje con el que podamos completar este post?

Foto: ahmadreza sajadi ( unsplash)


Volver a la Portada de Logo Paperblog