###### tags: `ASK`
# Lista 0
## Zadanie 1
- $42_{(8)} = 100010_{(2)} = 22_{(16)} = 34_{(10)}$
- $255_{(8)} = 10101101_{(2)} = AD_{(16)} = 173_{(10)}$
- $3047_{(8)} = 11000100111_{(2)} = 627_{(16)} = 1575_{(10)}$
- $140336_{(8)} = 1100000011011110_{(2)} = C0DE_{(16)} = 49374_{(10)}$
<img src="https://i.imgur.com/YW4mzaW.png" alt="drawing" width="600"/>
## Zadanie 2
- $22_{(16)} + 8_{(16)} = 2A_{(16)}$
- $73_{(16)} + 2C_{(16)} = 9F_{(16)}$
- $7F_{(16)} + 7F_{(16)} = FE_{(16)}$
- $C2_{(16)} + A4_{(16)} = 166_{(16)}$
<img src="https://i.imgur.com/W1xIqBY.png" alt="drawing" width="600"/>
## Zadanie 3
Wyzeruj $k$-ty bit zmiennej $x$:
```c
x &= ~(1<<k);
```
Ustaw $k$-ty bit zmiennej $x$:
```c
x |= 1<<k;
```
Zaneguj $k$-ty bit zmiennej $x$:
```c
x ^= 1<<k;
```
## Zadanie 4
- $x\cdot 2^y \to$ `x << y;`
- $\lfloor {x}/{2^y}\rfloor \to$ `x >> y;`
- $x \mod 2^y \to$ `x & ((1 << y) - 1);`
- $\lceil {{x}/{2^y}} \rceil \to$ `(x + (1 << y) - 1) >> y);`
## Zadanie 5
```c=
bool notPowerOfTwo(uint32_t x){
return ((x - 1) & x) | ((x - 1) & M);
}
// M = 0x8000_0000 (największa potęga dwójki, która mieści się w uint32_t)
// 0 - 1 = 0xFFFF_FFFF
// x == 0 => (x - 1) & M = 0xffff_ffff & M = M
// x <= M => (x - 1) & M = 0
// x > M => M
```
## Zadanie 6
**Big-endian** - najbardziej znaczący bajt umieszczony jest jako pierwszy.
**Little-endian** - najbardziej znaczący bajt umieszczony jest jako ostatni.
<img src="https://i.imgur.com/TrYlBEq.png" alt="drawing" width="600"/>
```c=
uint32_t convert(uint32_t n) {
uint32_t out = 0;
out += (n&0x000000ff)<<24;
out += (n&0x0000ff00)<<8;
out += (n&0x00ff0000)>>8;
out += (n&0xff000000)>>24;
return out;
}
```
## Zadanie 7
**ASCII** - siedmio bitowy system kodowania znaków; każdej liczbie przyporządkowany jest znak.
**Kody sterujące** nie odpowiadają żadnemu drukowalnemy znakowi, tylko służą do sterowania urządzeniem.
Kody sterujące ASCII:
- 0 - NULL
- 4 - EOT (end of transmission)
- 7 - sygnał dźwiękowy
- 10 - przesunięcie o jeden wiersz (`\n`)
- 12 - przesunięcie o jedną stronę
## Zadanie 8
**UTF-8** (8-bit Unicode Transformation Format) – system kodowania, wykorzystujący od 1 do 4 bajtów do zakodowania pojedynczego znaku, w pełni kompatybilny z ASCII. Jest najczęściej wykorzystywany do przechowywania napisów w plikach i komunikacji sieciowej.
Tablica ASCII ma tylko 128 znaków - do wielu celów to jest zdecydowanie za mało, UTF-8 rozwiązuje ten problem.
Kodowanie zależy od tego o jakim znaku mówimy. Dla odpowiednich przedziałów kodów korzystamy z tabeli:

Tekst do zakodowania: *Proszę zapłacić 5€!*
`50 72 6f 73 7a c4 99 20 7a 61 70 c5 82 61 63 69 c4 87 20 35 e2 82 ac 21`
```python=
s = 'Proszę zapłacić 5€!'
s.encode('utf-8') # Prosz\xc4\x99 zap\xc5\x82aci\xc4\x87 5\xe2\x82\xac!
s.encode('utf-8').hex() # 0x50726f737ac499207a6170c582616369c4872035e282ac21
```
Dla przykładu popatrzmy na €:
1. Kod dla € to U+20AC.
2. Jest to przedział między U+0800 a U+FFFF, więc potrzebujemy 3 bajtów.
3. $20AC_{16} = 0010 \space 0000 10\space10 1100_2$.
4. Korzystamy z tabeli w taki sposób, że w miejsce każdego $x$ wstawiamy kolejne bity.
5. Dostajemy na koniec takie kodowanie: $1110 \space 0010 \space 1000 \space 0010 \space 1010 \space 1100$
6. Co konwertujemy do systemu szesnastkowego: $1110 \space 0010 \space 1000 \space 0010 \space 1010 \space 1100 = E2 \space 82 \space AC$