Sistemes Numèrics

El sistema numèric que utilitzem tots en el nostre dia a dia és el sistema de numeració decimal. Això significa que utilitzem 10 dígits o símbols per representar els diferents números. A continuació es mostren els conceptes necessaris per poder comprendre més en profunditat el seu funcionament.

Definicions:

  • Sistema numèric: Conjunt ordenat de símbols o dígits i les regles amb què es combinen per representar quantitats numèriques. Cadascun d'aquests sistemes s'identifiquen per la seva base. Per exemple, tenim el sistema decimal, binari, hexadecimal...
  • Dígit: Un dígit, en un sistema numèric, és un símbol que no és combinació d'altres i que representa un enter positiu.
  • Base: La base d'un sistema numèric és el nombre de dígits diferents usats en aquest sistema. Per exemple:
    • Decimal (10 símbols): 0,1,2,3,4,5,6,7,8,9
    • Binari (2 símbols): 0,1
    • Hexadecimal (16 símbols): 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
    • Octal (8 símbols): 0,1,2,3,4,5,6,7
  • Notació: Per distingir entre els diferents sistemes numèrics es pot tancar entre parèntesis el nombre i se li afegeix un subíndex que indicarà la base que s'està fent servir. Si no s'usa subíndex s'haurà d'entendre que el nombre està en base 10, llevat que es digui el contrari. Exemples:
    • Decimal (10 símbols): (92)10 = 92 base 10 = 92 (en decimal)
    • Binari (2 símbols): (1011100)2 = 1011100 base 2 = 92 (en decimal)
    • Hexadecimal (16 símbols): (5C)16 = 5C base 16 = 92 (en decimal)

Com convertir entre bases

Per tal d'aprendre a convertir entre bases, utilitzarem les més típiques: decimal, binari i hexadecimal.

Decimal a binari

Per poder convertir un nombre en base 10 (decimal) a base 2 (binari), haurem de realitzar moltes divisions consecutives per 2, deixant constància de quins han sigut els resultats i les restes anteriors. A continuació es mostra el procediment detallat:

Decimal a Binari

Ara convertirem el número 28 de base 10 a base 2:

  1. Dividim 28 entre 2 → 14 (resta 0)
  2. Dividim 14 entre 2 → 7 (resta 0)
  3. Dividim 7 entre 2 → 3 (resta 1)
  4. Dividim 3 entre 2 → 1 (resta 1)
  5. Com hem obtingut 1 de resultat parem
  6. Llegim els resultats obtinguts tal i com es mostren a la imatge, començant per l'últim 1 obtingut i tenint en compte els resultats obtinguts a les restes

El resultat final obtingut és 11100.

Binari a decimal

Per poder convertir un nombre en base 2 (binari) a base 10 (decimal), haurem d'utilitzar les potències de 2.

En primer lloc, haurem d'escriure tantes potències de 2 com xifres tingui el nostre número binari, seguint el següent format:

... 210 29 28 27 26 25 24 23 22 21 20

↓ O el que és el mateix... ↓

... 1024 512 256 128 64 32 16 8 4 2 1

Llavors haurem de sumar tots aquells números en la posició dels qual tinguem un 1 en el nostre número binari. Per exemple si tinguéssim el número binari 1101101:

Potències de 2: 64 32 16 8 4 2 1
Número binari: 1 1 0 1 1 0 1

64 + 32 + 8 + 4 + 1 = 109 (1101101 en decimal)

Binari a hexadecimal / Hexadecimal a binari

En aquest cas, aprofitarem una propietat curiosa que poseeixen aquestes bases. Primer de tot, haurem d'escriure una taula amb les equivalències binari-hexadecimal entre els nombres 0 i 15 (els possibles valors hexadecimals). Aquesta taula quedaria així:

0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111

A partir d'aquesta taula, podrem realitzar conversions de manera senzilla, ja que cada caràcter en hexadecimal es pot convertir únicament substituint-lo pel seu equivalent en binari.

Al mateix temps, si convertim de binari a hexadecimal, únicament haurem d'agrupar de 4 en 4 les xifres (començant per la dreta) i realitzar el mateix procediment a la inversa. En cas que el nombre de xifres del nostre número binari no sigui múltiple de 4, haurem d'omplir-lo amb 0s per l'esquerra.

A continuació es mostren uns exemples:

Posem per cas que volem convertir el nombre 100111011 (binari a hexadecimal):

  1. Dividim el nombre binari en grups de 4: 1 - 0011 - 1011
  2. Afegim els 0s corresponents a l'esquerra: 0001 - 0011 - 1011
  3. Consultem les equivalències a la taula: 1 - 3 - B
  4. Ja tenim el nostre número en hexadecimal: 13B

Posem per cas que volem convertir el nombre 3F1 (hexadecimal a binari):

  1. Consultem les equivalències a la taula per cada una de les xifres: 0011 - 1111 - 0001
  2. Ja tenim el nostre número en binari: 001111110001 (o el que és el mateix: 1111110001)
  3. Els 0s que tinguem a l'esquerra del nostre resultat els podem ometre ja que no ens aporten informació. Per tant, el resultat final seria: 1111110001

Programació

A continuació es mostra com realitzar conversions de bases utilitzant diferents llenguatges de programació.

C++

Decimal a binari

	#include<iostream>
	
	using namespace std;
	
	int main()
	{
		int decimal = 123;
		int binari[32];
		
		int i = 0;
		while (n > 0) {
			// guardem la resta de la divisió en un array (0 o 1)
			binari[i] = n % 2;
			n = n / 2;
			i++;
		}
		
		// imprimim els valors per pantalla invertint l'ordre 
		for (int j = i - 1; j >= 0; j--)
		cout << binari[j];
		
		return 0;
	}
Binari a decimal

	#include <iostream>
	#include <string>
	using namespace std;
	
	int main()
	{
		string binari = "10101001";
		int decimal = 0;
	 
		// Inicialitzem la base a 1, es a dir 2^0
		int base = 1;
	 
		int len = num.length();
		for (int i = len - 1; i >= 0; i--) {
			if (num[i] == '1')
				decimal += base;
			base = base * 2;
		}
		
		cout << decimal << endl;
		
		return 0;
	}

	#include <iostream>
	
	using namespace std;
	 
	int main()
	{
		char binari[] = "1001";
		 
		cout << stoi(binari, 0, 2);
	 
		return 0;
	}
Decimal a hexadecimal

	#include <iostream>
	
	using namespace std;
	
	int main()
	{
		int val;
		cin >> val;
		cout << hex << val << endl;
		
		return 0;
	}

Python

Decimal a binari

	def decimalABinari(N):

		binari = 0
		exp = 0
		while (N != 0):
			res = N % 2
			c = pow(10, exp)
			binari += res * c
			N //= 2
			 
			# Comptador usat per guardar l'exponent
			exp += 1
		 
		return binari
	 
	# Codi principal
	N = 17
	print(decimalABinari(N))
Binari a decimal

	def binariADecimal(n):
		num = n;
		decimal = 0;
		 
		# Inicialitzem la base a 1, es a dir 2^0
		base = 1;
		
		temp = num;
		while(temp):
			ultim_digit = temp % 10;
			temp = int(temp / 10);
			 
			decimal += ultim_digit * base;
			base = base * 2;
		return decimal;
	 
	# Codi principal
	num = 10101001;
	print(binariADecimal(num));

	n = input()

	# Converteix n a base 2
	s = int(n, 2)
	
	print(s)
Decimal a hexadecimal

	def ChangeHex(n):
		if (n < 0):
			print(0)
		elif (n <= 1):
			print n,
		else:
			ChangeHex( n / 16 )
			x = (n%16)
			if (x < 10):
				print(x), 
			if (x == 10):
				print("A"),
			if (x == 11):
				print("B"),
			if (x == 12):
				print("C"),
			if (x == 13):
				print("D"),
			if (x == 14):
				print("E"),
			if (x == 15):
				print ("F"),

	decimal = 30
	hexadecimal = hex(decimal).split('x')[-1]
	print(hexadecimal)

Javascript

Decimal a binari

	<script>

		function decToBinary(n)
		{
			// array per emmagatzemar el nombre binari
			let binaryNum = new Array(32);
		 
			// comptador per l'array binari
			let i = 0;
			while (n > 0) {
		 
				// emmagatzema la resta a l'array binari
				binaryNum[i] = n % 2;
				n = Math.floor(n / 2);
				i++;
			}
		 
			// imprimeix per pantalla l'array binari en ordre invers
			for (let j = i - 1; j >= 0; j--)
				document.write(binaryNum[j]);
		}
		 
		// Codi principal
		let n = 17;
		decToBinary(n);
	 
	</script>
Binari a decimal

	<script>
		
		function binaryToDecimal(n)
		{
			let num = n;
			let dec_value = 0;
		 
			// Inicialitzem la base a 1, es a dir 2^0
			let base = 1;
		 
			let len = num.length;
			for (let i = len - 1; i >= 0; i--) {
				if (num[i] == '1')
					dec_value += base;
				base = base * 2;
			}
		 
			return dec_value;
		}
		 
		// Codi principal
		let num = "10101001";
		document.write(binaryToDecimal(num) + "<br>");
	 
	</script>

	<script>
         
		var binaryNumber = "1001";
		document.write(parseInt(binaryNumber, 2));
	 
	</script>
Decimal a hexadecimal

	hexString = yourNumber.toString(16);