diff options
1 files changed, 58 insertions, 56 deletions
| -rw-r--r-- | src/teaching/upp-2025/week14/bitwise-and-binary-representation.du | 114 |
diff --git a/src/teaching/upp-2025/week14/bitwise-and-binary-representation.du b/src/teaching/upp-2025/week14/bitwise-and-binary-representation.du index 8369230..ac76e8e 100644 --- a/src/teaching/upp-2025/week14/bitwise-and-binary-representation.du +++ b/src/teaching/upp-2025/week14/bitwise-and-binary-representation.du @@ -1,11 +1,11 @@ -# Побитови операции и представяне на числени данни - УПП, Седмица 14, 15.01.2026 +'def title Побитови операции и представяне на числени данни - УПП, Седмица 14, 15.01.2026 +'def desc Презентация върху размери на типове данни, 1s complement, 2s complement и IEEE754 -'define expected-reading 4 min -'define created 13 January 2026 -'define edited 14 January 2026 -[$pagenav] +# {title} -[$presentation-controller] +{pagenav 4 min;13 January 2026;14 January 2026} + +{presentation-controller} :title_slide @@ -16,17 +16,17 @@ ## Какво е бит? -[$br4] +{br4} :unordered - всичко в компютъра се представя в двоична бройна система -- [*бит*] е най-малката единица памет +- {i бит} е най-малката единица памет -- [*байт*] (byte) е най-малката [=адресируема=] единица памет +- {i байт} (byte) е най-малката {b адресируема} единица памет -- [*дума*] (word) е най-голямата [=обработваема=] единица памет +- {i дума} (word) е най-голямата {b обработваема} единица памет @@ -35,74 +35,76 @@ :slide35 -[$br3] +{br3} :unordered -- На [=модерни=] процесори: - [`x86-64`] (Intel/AMD), [`ARM`] (Apple M series/Snapdragon/Exynos/Cortex)\n +- На {b модерни} процесори: + {` x86-64} (Intel/AMD), {` ARM} (Apple M series/Snapdragon/Exynos/Cortex)\n байт е 8 бита, дума е 64 бита -- процесора извършва повечето инструкции върху [*думи*] +- процесора извършва повечето инструкции върху {i думи} -- в повечето архитектури, размера на един адрес ([=указател=]) е една [*дума*] +- в повечето архитектури, размера на един адрес ({b указател}) е една {i дума} -- [`bool`] заема един [*байт*], въпреки че стойността му може да се побере в един [*бит*] +- {` bool} заема един {i байт}, въпреки че стойността му може да се побере в един {i бит} Общо взето, за модерен процесор/ОС/... може да използвате размерите в долната таблица. .warn -[=Обаче=], стандарта на C++ определя единствено [*минимален*] размер за типовете. +{b Обаче}, стандарта на C++ определя единствено {i минимален} размер за типовете. Долните стойности не са закон! :slide35 -[$br2] +{br2} -:table_2 +:table +:2 |= Тип |= Размер -|: [`bool`], [`char`] +|: {` bool}, {` char} |: "1" бит (1 байт) -|: [`short`] +|: {` short} |: 16 бита (2 байта) -|: [`int`], [`float`] +|: {` int}, {` float} |: 32 бита (4 байта) -|: [`long`] -|: 32 бита [url https://learn.microsoft.com/en-us/windows/win32/winprog/windows-data-types#LONG Windows], 64 бита MacOS/Linux +|: {` long} +|: 32 бита {url Windows;https://learn.microsoft.com/en-us/windows/win32/winprog/windows-data-types#LONG}, 64 бита MacOS/Linux -|: [`long long`], [`double`] +|: {` long long}, {` double} |: 64 бита (8 байта) + :slide35 ## Побитови оператори -[$br4] +{br4} .p Аритметичните оператори извършват аритметика върху целите стойности на числата .p -Побитовите оператори извършват [*логически*] операции върху всеки два [*съответни*] бита +Побитовите оператори извършват {i логически} операции върху всеки два {i съответни} бита :slide35 -### Побитово "И" [`&`], "ИЛИ" [`|`], "НЕ" [`~`] +### Побитово "И" {` &}, "ИЛИ" {` |}, "НЕ" {` ~} .p -Работят като логическите [`&&`], [`||`], [`!`] но върху битовете. +Работят като логическите {` &&}, {` ||}, {` !} но върху битовете. Разглеждайки две еднобайтови числа: ``` @@ -110,7 +112,7 @@ 10010011 | 10011100 = 10011111 ~ 10010011 = 01101100 -### Побитово "изключващо или" [`^`] +### Побитово "изключващо или" {` ^} .p Истина, когато двата бита са различни и лъжа, когато са еднакви @@ -121,10 +123,10 @@ :middle_slide35 -### Отместване наляво [`<<`] +### Отместване наляво {` <<} .p -Отместваме битовете с [`n`] на брой позиции на ляво +Отместваме битовете с {` n} на брой позиции на ляво ``` 10010011 << 1 = 00100110 @@ -134,11 +136,11 @@ :middle_slide35 -### Отместване надясно [`>>`] +### Отместване надясно {` >>} .p -Отместваме битовете с [`n`] на брой позиции на дясно.\n -Ако типа е [`unsigned`]: +Отместваме битовете с {` n} на брой позиции на дясно.\n +Ако типа е {` unsigned}: ``` 10010011 >> 1 = 01001001 @@ -157,7 +159,7 @@ ## Представяне на цели числа -[$br4] +{br4} :unordered @@ -172,7 +174,7 @@ :middle_slide35 .p -Идея: [=старшия бит=] (най-левия) да определя дали е положително или отрицателно +Идея: {b старшия бит} (най-левия) да определя дали е положително или отрицателно ``` 000 0 @@ -188,7 +190,7 @@ :middle_slide35 .p -Проблем: нормалното събиране [=не=] работи +Проблем: нормалното събиране {b не} работи ``` 1 + 1 = 001 + 001 = 010 = 2 @@ -196,17 +198,17 @@ -1 + -1 = 101 + 101 = 1010 = 2 (отрязваме) .p -Не би ли било готино да представим числата, така че събиране/изваждане да работи по [*същия*] начин? +Не би ли било готино да представим числата, така че събиране/изваждане да работи по {i същия} начин? :slide ### 1s complement -[$br1] +{br1} .p -Отрицателното число е като положителното, но с [=обратните=] битове +Отрицателното число е като положителното, но с {b обратните} битове ``` 000 0 @@ -219,7 +221,7 @@ 111 -0 .p -Нарича се така, защото [`x & -x`] винаги е равно на [`111...111`] +Нарича се така, защото {` x & -x} винаги е равно на {` 111...111} :middle_slide35 @@ -237,15 +239,15 @@ -1 + -1 = 110 + 110 = 1100 = 1 + 100 = 101 = -2 .p -[=Плюсове:=] водещия бит е единица при отрицателни.\n -[=Минуси:=] има +0 и -0, нуждаем се от "end-arround carry". +{b Плюсове:} водещия бит е единица при отрицателни.\n +{b Минуси:} има +0 и -0, нуждаем се от "end-arround carry". :slide ### 2s complement -[$br1] +{br1} .p Като 1s complement, но при отрицателните числа изваждаме единица. @@ -261,7 +263,7 @@ 111 -1 .p -Нарича се така, защото [`x + -x`] е равно на 2 на степен броя битове +Нарича се така, защото {` x + -x} е равно на 2 на степен броя битове :middle_slide35 @@ -279,7 +281,7 @@ ## Представяне на числа с плаваща запетая -[$br1] +{br1} .p Идея: цяло число, в което закодираме позиция на точката. @@ -295,7 +297,7 @@ :slide35 -[$br3] +{br3} :unordered @@ -305,7 +307,7 @@ - Имаме много нули -- 4те бита за позиция са wasted, защото най-лявата позиция е 12, [`1100`] +- 4те бита за позиция са wasted, защото най-лявата позиция е 12, {` 1100} @@ -313,14 +315,14 @@ ### IEEE754 -[$br1] +{br1} .unordered -- Формат, публикуван през [url https://en.wikipedia.org/wiki/IEEE_754-1985 1985] година +- Формат, публикуван през {url 1985;https://en.wikipedia.org/wiki/IEEE_754-1985} година - За 16 бита, обхвата му е от -65504 до 65504, най-прецизното възможно число е 0.000000059604645 - Поддържа "числата" безкрайност и "not a number" - Представя числата като дроби (научна нотация) -- [=Не всички числа в обхвата могат да бъдат представени=] +- {b Не всички числа в обхвата могат да бъдат представени} - Числата около нулата могат да имат много цифри след запетаята, тези по-далеч могат по-малко @@ -330,7 +332,7 @@ Сложен е, любознателните могат да го разучат: .unordered -- [url https://mathcenter.oxford.emory.edu/site/cs170/ieee754/] -- [url https://www.h-schmidt.net/FloatConverter/IEEE754.html] -- [url https://en.wikipedia.org/wiki/Half-precision_floating-point_format#Half_precision_examples] -- [url https://codingnest.com/the-little-things-comparing-floating-point-numbers/] +- {url https://mathcenter.oxford.emory.edu/site/cs170/ieee754/} +- {url https://www.h-schmidt.net/FloatConverter/IEEE754.html} +- {url https://en.wikipedia.org/wiki/Half-precision_floating-point_format#Half_precision_examples} +- {url https://codingnest.com/the-little-things-comparing-floating-point-numbers/} |