View difference between Paste ID: SBtdzdDq and 4UHpkvXD
SHOW: | | - or go back to the newest paste.
1
БРОЙНИ СИСТЕМИ
2
=================================================
3
4
Формула за преобразуване от друга бройна система
5
в десетична: цифра * (основа^позиция)
6
7
Десетична бройна система
8
-------------------------------------------------
9
основа: 10
10
брой цифри: 10 (0 - 9)
11
12
3210 - позиции (индекси на цифрите)
13
2635 = 5 * 10^0 + 3 * 10^1 + 6 * 10^2 + 2 * 10^3
14
= 5*1 + 3*10 + 6*100 + 2*1000
15
= 5 + 30 + 600 + 2000 = 2635
16
-------------------------------------------------
17
18
Двоична бройна система
19
-------------------------------------------------
20
основа: 2
21
брой цифри: 2 (0 и 1)
22
23
43210 - позиции (индекси на цифрите)
24
10110 = 1 * 2^1 + 1 * 2^2 + 1 * 2^4 (разглеждаме 
25
само позициите, на които има 1-ца)
26
= 2^1 + 2^2 + 2^4
27
= 2 + 4 + 16 = 22
28
29
Бърз начин за проверка на дали смятаме правилно:
30
нечетните числа имат 1 на позиция 0
31
-------------------------------------------------
32
33
Преобразуване от десетична в двоична система
34
-------------------------------------------------
35
Число: 35
36
Метод: Делим числото на основата (2), докато
37
не получим 0. Резултата от делението (целочислено)
38
продължаваме на делим, а остатъците запазваме.
39
Накрая взимаме остатъците в обратен ред
40
41
число / основа = резултат (остатък):
42
35 / 2 = 17 (1)
43
17 / 2 = 8 (1)
44
8 / 2 = 4 (0)
45
4 / 2 = 2 (0)
46
2 / 2 = 1 (0)  
47
1 / 2 = 0 (1) // Приключваме при резултат 0
48
49
Остатъците в обратен ред са: 100011
50
51
Методът важи за всички бройни системи.
52
-------------------------------------------------
53
54
Представяне на числата в паметта
55
-------------------------------------------------
56
Числата се пазят в двоична система, като се 
57
запълват отляво с водещи (незначещи нули). Броят
58
водещи нули зависи от типа - при 32-битови числа
59
общият брой битове е 32, т.е. числото 1 ще бъде:
60
0000 0000 0000 0000 0000 0000 0000 0001
61
62
Старши бит - битът на най-лявата позиция, това е
63
31-ва за тип int/uint.
64
При типовете със знак, които могат да приемат и
65
положителни, и отрицателни стойности, старшият бит
66
показва дали числото е положително - ако битът е
67
1, числото е отрицателно. При uint старшият бит е
68
просто 2^31.
69
=================================================
70
71
БИТОВИ ОПЕРАЦИИ
72
=================================================
73
Това са операции върху двоичното представяне на
74
числата (така, както се пазят в паметта).
75
76
Шест на брой: ~, ^, &, |, >>, <<
77
78
~ - negation
79
-------------------------------------------------
80
Описание: Сменя стойността на всички битове на 
81
числото
82
83
Пример:
84
число: двоично представяне
85
5: 0000 0101
86
~5:1111 1010
87
Ако приемем, че работим с 8-битово число, стой-
88
ността на ~5 е 250 (ако работим с byte), или
89
-6 (ако работим с sbyte).
90
-------------------------------------------------
91
92
& - and
93
-------------------------------------------------
94
Описание: резултатът е число, което има 1-ци само
95
на тези позиции, на които и двата операнда имат 
96
1-ци. На всички останали позиции резултатът има 0.
97
98
Пример:
99
10: 	1010
100
6: 		0110
101
10 & 6: 0010 (2 в десетична бройна система)
102
103
Само на позиция 1 и двете числа (10 и 6) имат 1 - 
104
само там резултатът има 1-ца.
105
-------------------------------------------------
106
107
| - or
108
-------------------------------------------------
109
Описание: резултатът е число, което има 0-ли само
110
на тези позиции, на които и двата операнда имат
111
0-ли. На всички останали позиции резултатът има 1.
112
113
Пример:
114
10: 	1010
115
6: 		0110
116
10 | 6: 1110 (14)
117
118
Само на позиция 0 и двата операнда имат 0-ли,
119
както и на всички позиции след 3-та (водещите 
120
нули, които игнорираме).
121
-------------------------------------------------
122
123
^ - xor (exclusive or)
124
-------------------------------------------------
125
Описание: Резултатът има 1-ца само когато двата
126
операнда имат различни стойности на тази позиция.
127
Т.е. имаме 1 в резултата ако имаме 1 и 0 в опера-
128
ндите; имаме 0 в резултата ако операндите имат 
129
битове с еднаква стойност.
130
131
Пример:
132
10: 	1010
133
6: 		0110
134
10 ^ 6: 1100 (12)
135
136
На позиции 2 и 3 операндите имат различни стойно-
137
сти, докато на позиции 0 и 1 имат еднакви.
138
-------------------------------------------------
139
140
n >> p - right shift p times <=> n / 2^p
141
-------------------------------------------------
142
Описание: Изместваме битовете на числото p пъти
143
надясно. На най-лявата позиция добавяме 0.
144
Аналогично на целочислено деление на 2^p.
145
146
Пример:		
147
10:			1010
148
10 >> 1 : 	0101 (5) <=> 10 / 2
149
10 >> 2:	0010 (2) <=> 10 / 2^2
150
-------------------------------------------------
151
152
n << p - left shift p times <=> n * 2^p
153
-------------------------------------------------
154
Описание: Изместваме битове на числото p пъти
155
наляво. На позиция 0 добавяме 0.
156
Аналогично на умножение по 2^p.
157
158
Пример:
159
6:			00110
160
6 << 1:		01100 (12) <=> 6 * 2
161
6 << 2:		11000 (24) <=> 6 * 2^2
162
=================================================
163
164
ПОЛЕЗНИ ФОРМУЛИ
165
=================================================
166
167
set bit at position p: number |= (1 << p)
168
-------------------------------------------------
169
Описание: на дадена позиция p искаме да сетнем
170
бита (да го направим 1), без значение каква е 
171
стойността му.
172
173
Пример (искаме да сетнем бита на позиция 2):
174
10001 - number
175
00001 - 1
176
00100 - 1 << 2
177
10101 - number | (1 << 2)
178
-------------------------------------------------
179
180
unset bit at position p: number &= ~(1 << p)
181
-------------------------------------------------
182
Описание: на дадена позиция p искаме да занулим
183
бита (да го направим 0), без значение каква е 
184
стойността му.
185
186
Пример (искаме да занулим бита на позиция 2):
187
10101 - number
188
00001 - 1
189
00100 - 1 << 2
190
11011 - ~(1 << 2) // водещите нули също са 1-ци
191
10001 - number & ~(1 << 2)
192
-------------------------------------------------
193
194
flip bit at position p: number ^= (1 << p)
195
-------------------------------------------------
196
Описание: Искаме да сменим стойността на бита на
197
дадена позиция - от 0 да го направим 1 или от 
198
1 - 0.
199
200
Пример 1 (позиция 2):
201
10101 - number
202
00001 - 1
203
00100 - 1 << 2
204
10001 - number ^ (1 << 2)
205
206
Пример 2 (позиция 2):
207
10001 - number
208
00001 - 1
209
00100 - 1 << 2
210
10101 - number ^ (1 << 2)
211
-------------------------------------------------
212
213
check bit at position: (number >> p) & 1 == 1
214
-------------------------------------------------
215
Описание: Проверяваме на позиция p дали битът е
216
сетнат (1).
217
218
Пример (позиция 2):
219
10101 - number 
220
00101 - number >> 2 
221
00101 & 1 == 1 ? set : unset
222
-------------------------------------------------