$$ \newcommand{\R}{\mathbb{R}} \newcommand{\RR}{\mathbb{R}} \newcommand{\Nuc}{\text{Nuc}} %\newcommand{\vv}[1]{\overrightarrow{#1}} \newcommand{\vv}[1]{\vec{#1}} \newcommand{\D}{\text{Dom}} \newcommand{\Dom}{\text{Dom}} $$

1 Tema 1: Codis i Criptografia

Aquesta secció introdueix els conceptes fonamentals sobre com representem la informació, tant matemàticament com digital. Veurem diferents sistemes de numeració, com el sistema binari i l’hexadecimal, i com l’ordinador els fa servir per representar nombres reals, colors i text.

1.1 1. Teoria bàsica: Nombres en base \(n\)

L’ésser humà utilitza el sistema decimal (Base 10). Fem servir 10 símbols (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) i el seu origen és purament anatòmic: tenim deu dits a les mans. Es tracta d’un sistema posicional, on cada xifra té un pes determinat per una potència de 10 segons la seva ubicació.

Per exemple: \[1032 = 1\cdot 10^3 + 0\cdot 10^2 + 3\cdot 10^1 + 2\cdot 10^0\]

Què passaria si tinguéssim una anatomia diferent? Si, posem per cas, haguéssim tingut 12 dits, el nostre sistema natural seria el de base 12. Necessitaríem 12 símbols. Com que el nostre sistema actual només en té 10, hauríem d’inventar-ne dos més. Per convenció en matemàtiques, fem servir les primeres lletres de l’alfabet: \(A \longrightarrow 10\) i \(B \longrightarrow 11\).

En base 12, el nombre \(23A0B\) es llegeix i es passa a decimal de la següent manera: \[23A0B_{12} = 2\cdot 12^4 + 3\cdot 12^3 + 10\cdot 12^2 + 0\cdot 12^1 + 11\cdot 12^0 = 48.107_{10}\]

1.2 2. Base 2: El sistema binari

Malgrat que el sistema binari ja tenia referències a l’antic Egipte, avui dia és l’idioma natiu de la informàtica. Aquest sistema només fa servir dos símbols: 1 i 0.

En electrònica digital, això resulta extremadament útil perquè permet traduir els valors als estats físics d’un circuit (passa corrent vs. no passa corrent, encès vs. apagat, alt voltatge vs. baix voltatge). Cada dígit d’un nombre escrit en binari rep el nom de bit (binary digit).

Passar un nombre binari a decimal és fàcil, només hem de sumar les potències de 2 pertinents: \[10110_2 = 1\cdot 2^4 + 0\cdot 2^3 + 1\cdot 2^2 + 1\cdot 2^1 + 0\cdot 2^0 = 16 + 0 + 4 + 2 + 0 = 22_{10}\]

1.2.1 Conversió de Decimal a Binari

Com podem expressar un nombre del nostre dia a dia en el llenguatge dels ordinadors? El mètode es basa en escriure el nombre com a suma de potències de 2, fet que s’aconsegueix aplicant divisions euclidianes (amb quocient i residu) successives entre 2.

Passem el 357 a base 2: 1. Dividim \(357 \div 2 \longrightarrow\) Quocient: 178, Residu: 1. Això vol dir que \(357 = 178 \cdot 2^1 + \mathbf{1} \cdot 2^0\) 2. Ara agafem el 178, com que és més gran que 1, el dividim: \(178 \div 2 \longrightarrow\) Quocient: 89, Residu: 0. 3. Continuem amb el 89: \(89 \div 2 \longrightarrow\) Quocient: 44, Residu: 1. 4. Continuem el procés successivament fins arribar a un quocient de 1: * \(44 = 22 \cdot 2 + \mathbf{0}\) * \(22 = 11 \cdot 2 + \mathbf{0}\) * \(11 = 5 \cdot 2 + \mathbf{1}\) * \(5 = 2 \cdot 2 + \mathbf{1}\) * \(2 = 1 \cdot 2 + \mathbf{0}\) * I el darrer quocient, que passa a ser l’últim element a afegir: 1.

Si agrupem tots els quocients i residus obtinguts llegint-los a la inversa (de l’últim quocient cap al primer residu), obtenim la descomposició completa: \[357_{10} = 1\cdot 2^8 + 0\cdot 2^7 + 1\cdot 2^6 + 1\cdot 2^5 + 0\cdot 2^4 + 0\cdot 2^3 + 1\cdot 2^2 + 0\cdot 2^1 + 1\cdot 2^0\] Per tant, \(357_{10} = 101100101_2\).

(Nota curiosa: Sabies que amb una sola mà, fent servir els dits com a zeros (abaixat) o uns (aixecat), podem comptar fins al nombre binari \(11111_2\), és a dir, fins a 31?)

1.2.2 📝 Posa’t a prova

  • Quin és el nombre \(110101_2\) en base decimal? Resposta: \(1\cdot 2^5 + 1\cdot 2^4 + 0 + 1\cdot 2^2 + 0 + 1\cdot 2^0 = 32 + 16 + 4 + 1 = 53_{10}\).
  • Quants nombres diferents es poden representar amb 16 bits? Resposta: Si tenim 16 posicions i 2 possibilitats per posició (0 o 1), podem representar \(2^{16} = 65.536\) nombres diferents (des del \(0\) fins al \(65.535\)).
  • Com s’escriu el nombre 135 en binari? I el 134597? Resposta: \(135\) és \(128+4+2+1\), per tant \(10000111_2\). El \(134597\) el pots calcular mitjançant divisions per 2, el resultat serà \(100000110111000101_2\).
  • Quin és el nombre mínim de bits que caldrien per representar 5000 nombres diferents? Resposta: Hem de trobar una potència de 2 superior a 5000. Amb 12 bits fem \(2^{12} = 4096\) (no n’hi ha prou). Amb 13 bits arribem a \(2^{13} = 8192\). Per tant, necessitem com a mínim 13 bits.

1.3 3. Precisió doble (Tipus Double o Float)

Si el binari només admet nombres sencers mitjançant potències de 2 consecutives, com es representa un nombre real (amb decimals) a l’ordinador? S’utilitza l’estàndard IEEE 754 de punt flotant.

A la memòria, es reserven 64 bits (precisió doble) que es divideixen en 3 grans blocs que defineixen la següent fórmula: \[\text{Valor} = (-1)^{\text{signe}} \cdot \left( 1 + \sum_{i=1}^{52} b_i \cdot 2^{-i} \right) \cdot 2^{\text{exponent}-1023}\]

  1. Signe (1 bit): Determina si el nombre és positiu (0) o negatiu (1).
  2. Exponent (11 bits): Ajusta l’escala o magnitud del nombre, de manera similar a la notació científica. Se li resta sempre un “biaix” (bias) de 1023.
  3. Mantissa (52 bits): Són la resta de bits encarregats de la fracció. L’ordinador sempre pressuposa un “1.” al davant (que no s’emmagatzema per estalviar espai, l’“hidden bit”).

Qüestions sobre precisió: * Valors límit: El nombre positiu més proper a 0 que es pot representar és minúscul, de l’ordre de \(2.22 \times 10^{-308}\). El més gran absolut arriba fins aprox. \(1.79 \times 10^{308}\). * Repartiment de l’espai: Si volem representar un nombre que comenci per “21,” ens caldran almenys 5 bits de mantissa per codificar aquest 21 (\(2^4+2^2+2^0\)). Així doncs, dels 53 bits reals de precisió, ens en quedaran 48 només per als decimals.

1.4 4. Base 16: Sistema Hexadecimal

A part del binari, l’ordinador sol emprar freqüentment l’Hexadecimal (Base 16). Per què? Perquè l’agrupació de 4 bits coincidirà de manera exacta amb un dígit hexadecimal (ja que \(2^4 = 16\)), fent-lo ideal per a llegir el binari de manera “comprimida” i comprensible per l’humà.

Per a representar la base 16 es fan servir 16 símbols: \[0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F\] (on A=10, B=11, C=12, D=13, E=14 i F=15).

Les seves aplicacions més típiques avui en dia inclouen: * Codificar les adreces MAC de targetes de xarxa (ethernet, wifi, bluetooth, etc.). * Representar codis de color en disseny web i digital (Codi RGB).

1.5 5. El codi RGB

S’utilitza per representar els colors a les pantalles digitals. Es construeix combinant tres quantitats corresponents a tres canals de color llum (model additiu): * Red (Vermell) * Green (Verd) * Blue (Blau)

S’atorguen dos dígits hexadecimals per canal (un byte sencer, és a dir, valors en decimal de \(0\) a \(255\)). Un nivell de \(255\) en hexadecimal es representa com a FF, i és la quantitat màxima de color per a aquell canal. El 00 indica l’absència d’aquell color (cap aportació de llum).

Exemples i interpretació: * 000000: Representa el negre (cap aportació ni de R, ni de G, ni de B). * FFFFFF: Representa el blanc pur (tots els canals emetent el màxim de llum). * FF0000: Representa el vermell pur (R=al màxim; G,B = apagats). * 444444: Com que té la mateixa proporció de cada canal, forma un color neutre: un gris fosc. * AF69C4: Té força vermell (AF) i blau (C4), amb una mica menys de verd (69). El resultat visualment tira cap a tons liles, malves o violats.

1.6 6. Codis ASCII i UTF-8: Traduint text a nombres

Igual que podem traduir colors a nombres hexadecimals o binaris, la lletra d’aquest text mateix està codificada digitalment per l’ordinador. * ASCII (American Standard Code for Information Interchange): Va ser un primer estàndard creat als EUA. Feia servir 7 bits (assignant nombres de 0 a 127) per traduir lletres llatines sense accents, números i símbols. * ASCII Estès: Posteriorment es va fer servir el bit lliure per treballar amb 8 bits, permetent incloure caràcters propis d’altres països (les vocals accentuades del català, la Ñ, la Ç, etc.). * UTF-8: Avui en dia és el més usat. Utilitza blocs des d’1 byte (8 bits) fins a 4 bytes, sent retrocompatible amb l’antic ASCII, i capaç de representar lletres de tots els alfabets mundials actuals i històrics (Xinès, Àrab, Círilic…) fins i tot els Emojis!

Consulta aquí la taula de codis ASCII sencera