Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / upp-2025 / week14 / bitwise-and-binary-representation.du
diff options
context:
space:
mode:
1 files changed, 58 insertions, 56 deletions
-rw-r--r--src/teaching/upp-2025/week14/bitwise-and-binary-representation.du114
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/}