###### 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: ![alt text](https://i.imgur.com/kS5LBGy.png "Logo Title Text 1") 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$