---
marp: true
theme: catppuccin
paginate: true
size: 4:3
transition: coverflow
footer: ''
math: katex
---

<style>
section {
  font-size: 32px;
}
</style>


# Représentation des entiers naturels
---

- Nombres peuvent avoir des représentations différentes. 
- En informatique :
    - Décimal (base 10)
    - Binaire (base 2)
    - Hexadécimal (Base 16)
    - Octal (base 8)

---

## Base 10 et généralisation

---

* Succession de symboles qui représentent une valeur : les chiffres
* Système positionnel : la valeur du symbole diffère selon sa position dans le nombre
    - Ex: 222
* Position = **Rang** ou **Poids**

---

!!! success Formule
$$ a_n \times 10^n + ... + a_2 \times 10^2 + a_1 \times 10^1 + a_0 \times 10^0 $$
!!!

$a_i$ sont les chiffres de rang $i$

!!! warning Attention
Le plus petit rang (celui des unités) est de 0 (10⁰ = 1) et non pas de 1 (10¹ = 10)
!!!

---

Si on généralise :

!!! success Formule à retenir
$$  a_n \times b^n + ... + a_2 \times b^2 + a_1 \times b^1 + a_0 \times b^0 $$
!!!

---

- Les $a_i$ diffèrent selon les bases : 
    - en base 10 : chiffres de 0 à 9
    - en base 2 : chiffres de 0 à 1
    - en base 16 : 0 à F 
        - lettres pour les "chiffres" au delà de 9

---

Par exemple :
* $48_{|10}$ : $4\times10^1+8\times10^0$ 
* $56_{|16}$ : $5\times16^1+6\times16^0$
* $1011_{|2}$ : $1\times2^3+0\times2^2+1\times2^1+1\times2^0$

---

Exercice : Découper selon la formule 
- $345_{|10}$
- $\mathrm{6A}_{|16}$
- $1101_{|2}$
---

## La base 2, système binaire

---

* Très utilisé en informatique, réseau, électronique numérique...
* Chaque poids = puissance de 2
* On utilisera 0 et 1 : des **bits**
* Paquets de 8 bits : **octets**
* Exemple : 
    $$11_{|2} = 1\times2^1+1\times2^0 = 3_{|10}$$

---

Exercice : Convertir en décimal les nombres suivants
- $101_{|2}$
- $11010_{|2}$

---

### MSB et LSB

- Bits situés aux extrémités:
    - **MSB** (*Most Significant Bit*) ou **bits de poids fort** : à gauche
    - **LSB** (*Least Significant Bit*) ou **bits de poids faible** : à droite
- Exemple :

|1|0|0|1|
|-|-|-|-|
|MSB|||LSB|

---

Exercice : Donner le LSB et le MSB
- 10010100
 
---

### Multiples d'octets

- Puissances de 10
- Puissances de 2

---
<style scoped>
table {
  font-size: 28px;
}
</style>

| Nom | Symbole | Nombre d'octets | Relation |
|-|-|-|-|
| kilooctet | ko | 10³ | 1000 octets
| mégaoctet | Mo | 10⁶ (million) | 1000 ko
| gigaoctet | Go | 10⁹ (milliard) | 1000 Mo
| téraoctet | To | 10¹² (billion) | 1000 Go 
| pétatoctet | Po | 10¹⁵ (billiard) | 1000 To

---
<style scoped>
table {
  font-size: 28px;
}
</style>

| Nom | Symbole | Nombre d'octets | Relation |
|-|-|-|-|
|kibioctet|Kio| 2¹⁰ | 1024 o |
|mébioctet|Mio| 2²⁰ | 1024 Kio |
|gibioctet|Gio| 2³⁰ | 1024 Mio |
|tébioctet|Tio| 2⁴⁰ | 1024 Gio |

---

Exercice :  

- La capacité d’un disque SSD est annoncée comme étant 512Go. 
    - Quelle est sa capacité en Gio et en Tio ?

<!--
Capacité donnée : 512 Go = 512.10⁹ octets
⇒ Capacité en Gio : 512.10⁹ / 2³⁰ ≈ 476,84 Gio
⇒ Capacité en Tio : 512.10⁹ / 2⁴⁰ ≈ 0,46 Tio
-->
---

### Conversion décimal vers binaire

- 2 méthodes :
    - Soustractions successives
        - petits nombres
    - Divisions successives
        - grands nombres

---

#### Méthode des soustractions successives

$137_{|10} = 10001001_{|2}$

|128|64|32|16|8|4|2|1|
|---|--|--|--|-|-|-|-|
|1  |0 | 0| 0|1|0|0|1|

---

1. Créer un tableau avec les puissances de 2
1. De gauche à droite (du + grand au + petit)
    - 0 si colonne > votre nombre
    - 1 si colonne < ou = à votre nombre
1. Soustrayez la colonne et recommencez

---
<style scoped>
section {
  font-size: 32px;
}
</style>

!!! tip Astuce
Pour savoir quelle taille doit faire le tableau
- Connaître puissances de 2
- **Ou** prendre la **partie entière** de 
    - $log(N)/log(2)$ 
    - $log_2(N)$

- Exemple avec $2367_{|10}$
    - $log(2367)/log(2) = 11,208$ 
    - Donc 2¹¹ soit 2048
!!!
---

Exercice: Convertir en binaire
- $253_{|10}$
- $111_{|10}$

<!--
253 = 1111 1101
111 = 0110 1111
-->

---

#### Méthode des divisions successives

---

Exemple avec le nombre $53_{|10}$ qui s'écrit $110101_{|2}$ en binaire :

![divisions successives width:500px](divisions_successives.svg)

---
<style scoped>
section {
  font-size: 32px;
}
</style>
- La méthode :
    1. Divisez le nombre par 2. Notez le reste et le quotient.
    2. Divisez le quotient par 2. Notez le reste.
    3. Recommencez jusqu'à avoir un quotient de 0
    4. Prenez le reste de chacune de vos divisions dans l'ordre **inverse** de vos calculs. 
    - Le dernier reste : bit de poids fort (MSB) 
    - le premier reste : bit de poids faible (LSB)

---

Exercice: Convertir en binaire
- $253_{|10}$
- $111_{|10}$

<!--
253 = 1111 1101
111 = 0110 1111
-->

---

## La base 16, système hexadécimal

---

* Également très utilisé : Adresses MAC, IPv6, couleurs...
* Chaque symbole représente une puissances de 16
* Nombres de 0 à 9 + lettres de A à F
    - $\mathrm{3B} = 3_{|10}\times16^1 + 11_{|10}\times16^0 = 59_{|10}$
* Convention : `0x` -> `0x1CF`

---

Exercice: Convertir en décimal
- 0x1CF
- 0x3B7

<!--
0x1CF = 463
0x3B7 = 951
-->

--- 

### Conversion binaire vers hexadécimal

- Regrouper les bits par 4 
- Compléter si besoin avec des 0
- Remplacer chaque groupe par sa représentation hexadécimale
    - Comment s'en souvenir ? Dessiner le tableau

---

Exemple avec $110101_{|2}$:

$$\overbrace{00}^{\text{ajout}}110101$$

$$\overbrace{0011}^{3_{|16}}\overbrace{0101}^{5_{|16}}$$

Résultat : $110101_{|2} = 35_{|16}$

---

Exercice : Convertir en hexadécimal
- $11000101_{|2}$
- $101010_{|2}$

<!--
- C5
- 2A
-->
---

Exercice : Convertir en binaire
- 0x6E
- 0x3CF

<!--
- 0110 1110
- 0011 1100 1111
-->

---

### Conversion décimal vers hexadécimal

Deux méthodes possibles:
- On convertit en binaire puis en hexadécimal
- On utilise la méthode des divisions successives, mais en divisant par 16

---

Exemple avec $47_{|10}$.

|32|16|8|4|2|1|
|--|--|-|-|-|-|
| 1| 0|1|1|1|1|

$${\overbrace{0010}^{2_{|16}}\overbrace{1111}^{\mathrm{F}_{|16}}}_{|2} = \mathrm{2F}_{|16}$$

---

Exemple avec $47_{|10}$.

![divisions hexa width:500px](divisions_hexa.svg)

On obtient donc $47_{|10} = \mathrm{2F}_{|16}$

---

# Opérateurs booléens

---
<style scoped>
section {
  font-size: 28px;
}
</style>
- Algèbre de Boole ou calcul booléen : 
    - opérations logiques sur des bits
- Utile pour :
    - En programmation pour valider des conditions
    - En embarqué ou en réseau pour faire des calculs sur des nombres binaires

---

## Opérateur ET

---
<style scoped>
section {
  font-size: 28px;
}
</style>

!!! success À retenir
L'opérateur ET ne renvoie 1 que si les deux arguments sont à 1. Sinon il renvoie 0.

**Si A ET B valent 1**

|A|B|A ET B|
|-|-|:-:|
|0|0|0|
|1|0|0|
|0|1|0|
|1|1|1|

En python :
- `and` lorsqu'on travaille avec des booléens 
- `&` lorsqu'on veut travailler en bit à bit
!!!

---

![ET width:500px](ET.svg)

---

## Opérateur OU

---
<style scoped>
    section {
        font-size: 28px;
}
</style>
!!! success À retenir
L'opérateur OU renvoie 1 si au moins l'un des deux arguments est à 1. Sinon il renvoie 0.

**Si A vaut 1 ou si B vaut 1 ou si les deux valent 1**

|A|B|A OU B|
|-|-|:-:|
|0|0|0|
|1|0|1|
|0|1|1|
|1|1|1|

En python:
- `or` lorsqu'on travaille avec des booléens  
- `|` lorsqu'on veut travailler en bit à bit. 
!!!

---

![OU width:500px](OU.svg)

---

## Opérateur NON

---

<style scoped>
    section {
        font-size: 28px;
}
</style>
!!! success À retenir
L'opérateur NON inverse la valeur du bit auquel il est appliqué.

|A|NON A|
|-|:-:|
|0|1|
|1|0|

En python: 
- `not` lorsqu'on travaille avec des booléens 
- `~` pour l'inversion bit à bit.
!!!

---

![NON](NOT.svg)

---

## Opérateur OU EXCLUSIF

---
<style scoped>
    section {
        font-size: 28px;
}
</style>
!!! success À retenir
OU EXCLUSIF renvoie 1 si seulement l'un des deux arguments est à 1. Sinon il renvoie 0.

**Si A seulement vaut 1 ou si B seulement vaut 1**

|A|B|A XOR B|
|-|-|:-:|
|0|0|0|
|1|0|1|
|0|1|1|
|1|1|0|

En python, il n'existe pas. Il est en pratique rarement utilisé.
!!!

---

![XOR](XOR.svg)