Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π― Π·Ρ‹ΠΊ Π‘ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ макроассСмблСром Π·Π° Π΅Π³ΠΎ тягу ΠΊ ΠΆΠ΅Π»Π΅Π·Ρƒ. Если Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΈΠ΅ конструкции Π½Π° ассСмблСрС прСобразуСтся ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΠ·ΠΌ языка (простоту языка Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с простотой программирования Π½Π° языкС) ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… си остаётся СдинствСнным высокоуровнСвым языком программирования. Π‘Π΅Π· ΠΎΠ±Π·ΠΎΡ€Π° ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, изучСния языка Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΌ.

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ понятно ΠΈΠ· названия, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСпосрСдствСнно с Π±ΠΈΡ‚Π°ΠΌΠΈ. Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ количСство ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² использования ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠ½ΠΈΠ³Π΅ Π“Π΅Π½Ρ€ΠΈ Π£ΠΎΡ€Ρ€Π΅Π½Π° «АлгоритмичСскиС Ρ‚Ρ€ΡŽΠΊΠΈ для программистов». Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ рассмотрим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сами ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹.

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ И, Π˜Π›Π˜, НЕ, ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•: здСсь ΠΈ Π΄Π°Π»Π΅Π΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ 8-Π±ΠΈΡ‚Π½Ρ‹Π΅ числа для упрощСния записи. Всё это Π²Π΅Ρ€Π½ΠΎ ΠΈ для Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… чисСл.

Н апомню для Π½Π°Ρ‡Π°Π»Π°, Ρ‡Ρ‚ΠΎ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ И, Π˜Π›Π˜, ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜ ΠΈ НЕ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ описаны с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°Π±Π»ΠΈΡ† истинности

ЛогичСский ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π˜Π›Π˜

XYX OR Y
000
011
101
111
ЛогичСский ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜

XYX XOR Y
000
011
101
110

Π’ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… (bit-wise) опСрациях Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΡ‚Π°, Ρ€Π°Π²Π½ΠΎΠ΅ 1, рассматриваСтся ΠΊΠ°ΠΊ логичСская истина, Π° 0 ΠΊΠ°ΠΊ лоТь. ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ И (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ &) Π±Π΅Ρ€Ρ‘Ρ‚ Π΄Π²Π° числа ΠΈ логичСски ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΈΡ‚Ρ‹. НапримСр, Ссли логичСски ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ 3 Π½Π° 8, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ 0

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ 3 Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚Π½ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ прСдставляСт собой

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π±ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ c Ρ€Π°Π²Π΅Π½ логичСскому ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° числа a ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° числа b. И Ρ‚Π°ΠΊ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°.

00000011
00001000 ↓↓↓↓↓↓↓↓
00000000

00011111
00010001 ↓↓↓↓↓↓↓↓
00010001

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ чисСл 35 ΠΈ 15 Ρ€Π°Π²Π½ΠΎ 3.

00100011
00001111 ↓↓↓↓↓↓↓↓
00000011

Аналогично Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ опСрация ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π˜Π›Π˜ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ |), Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° логичСски суммируСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ чисСл Π±Π΅Π· пСрСноса.

00001111
00001011 ↓↓↓↓↓↓↓↓
00001111

00100001
00001011 ↓↓↓↓↓↓↓↓
00101011

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΎΡ‚Ρ€ΠΈΡ†Π°Π½ΠΈΠ΅ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€

) Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°, Π° для всСго числа Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ инвСрсии мСняСт лоТь Π½Π° истину, Π° истину Π½Π° лоТь, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°. НапримСр,

Π˜ΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ^) примСняСт ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ XOR. НапримСр, для чисСл

Иногда логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ && ΠΈ || ΠΏΡƒΡ‚Π°ΡŽΡ‚ с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ & ΠΈ |. Π’Π°ΠΊΠΈΠ΅ ошибки ΠΌΠΎΠ³ΡƒΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅ достаточно Π΄ΠΎΠ»Π³ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π² рядС случаСв Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. НапримСр, для чисСл 1 ΠΈ 0. Но Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² си истиной являСтся любоС Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ чисСл 3 ΠΈ 4 Π²Π΅Ρ€Π½Ρ‘Ρ‚ 0, хотя логичСскоС ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ истину.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига

О ΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сдвига Π΄Π²Π΅ – Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²Π»Π΅Π²ΠΎ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ >). Π‘ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²ΠΏΡ€Π°Π²ΠΎ сдвигаСт Π±ΠΈΡ‚Ρ‹ числа Π²ΠΏΡ€Π°Π²ΠΎ, дописывая слСва Π½ΡƒΠ»ΠΈ. Π‘ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²Π»Π΅Π²ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠ΅: сдвигаСт Π±ΠΈΡ‚Ρ‹ Π²Π»Π΅Π²ΠΎ, дописывая справа Π½ΡƒΠ»ΠΈ. Π’Ρ‹ΡˆΠ΅Π΄ΡˆΠΈΠ΅ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ числа Π±ΠΈΡ‚Ρ‹ ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ.

НапримСр, сдвиг числа 5 Π²Π»Π΅Π²ΠΎ Π½Π° 2 ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ

Π‘Π΄Π²ΠΈΠ³ числа 19 Π²ΠΏΡ€Π°Π²ΠΎ Π½Π° 3 ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ

00010011 >> 3 == 00000010

НСзависимо ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ (big-endian, ΠΈΠ»ΠΈ little-endian, ΠΈΠ»ΠΈ middle-endian) числа Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ, ΠΎΡ‚ Π±ΠΎΠ»Π΅Π΅ Π·Π½Π°Ρ‡Π°Ρ‰Π΅Π³ΠΎ Π±ΠΈΡ‚Π° ΠΊ ΠΌΠ΅Π½Π΅Π΅ Π·Π½Π°Ρ‡Π°Ρ‰Π΅ΠΌΡƒ. ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° – число, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ произвСсти сдвиг, ΠΈ число Π±ΠΈΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ произвСсти сдвиг.

Π’Π°ΠΊ ΠΊΠ°ΠΊ сдвиг Π²ΠΏΡ€Π°Π²ΠΎ (>>) дописываСт слСва Π½ΡƒΠ»ΠΈ, Ρ‚ΠΎ для Ρ†Π΅Π»Ρ‹Ρ… чисСл опСрация Ρ€Π°Π²Π½ΠΎΡΠΈΠ»ΡŒΠ½Π° цСлочислСнному дСлСнию ΠΏΠΎΠΏΠΎΠ»Π°ΠΌ, Π° сдвиг Π²Π»Π΅Π²ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡŽ Π½Π° 2. ΠŸΡ€ΠΎΠΈΠ·Π²Π΅ΡΡ‚ΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг для числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π±Π΅Π· явного привСдСния Ρ‚ΠΈΠΏΠ° нСльзя. Π­Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Π½ΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ для си Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ прСдставлСниС числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. Однако ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ число Ρ‚ΠΈΠΏΠ° float Π² int, Π·Π°Ρ‚Π΅ΠΌ ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ

Но ΠΌΡ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π΅ 5.0f, Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ число.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² сдвига являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ вСсти сСбя с числами со Π·Π½Π°ΠΊΠΎΠΌ ΠΈ Π±Π΅Π· Π·Π½Π°ΠΊΠ°, Π² зависимости ΠΎΡ‚ компилятора. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ содСрТит ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚ Π·Π½Π°ΠΊΠ°. Когда ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ сдвиг Π²Π»Π΅Π²ΠΎ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΏΠ°ΡΡ‚ΡŒ, число станСт ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Однако, компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ сдвиг останСтся знакопостоянным ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ. Π’ΠΎ ΠΆΠ΅ самоС ΠΈ для сдвига Π²ΠΏΡ€Π°Π²ΠΎ.

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ сдвигС всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΈ Π·Π°Π΄ΡƒΠΌΠ°Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ число Π±Π΅Π· Π·Π½Π°ΠΊΠ°. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС компилятор VSE2013 оставляСт Π·Π½Π°ΠΊ. Однако Ссли ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° прСдставлСниС этого числа, ΠΊΠ°ΠΊ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ, сдвиг происходит ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, с сохранСниСм самого Π»Π΅Π²ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°. Π’ послСднСй строчкС, Ссли привСсти число со Π·Π½Π°ΠΊΠΎΠΌ ΠΊ числу Π±Π΅Π· Π·Π½Π°ΠΊΠ°, Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ сдвиг, ΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число.

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ сдвига Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ значСния числа, возвращая Π½ΠΎΠ²ΠΎΠ΅. Они Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² состав слоТного присваивания

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

1. НапишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π±ΠΈΡ‚ числа

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ Π±ΠΈΡ‚ (1 ΠΈΠ»ΠΈ 0) стоит Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ n, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ логичСским ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.

ΠŸΡƒΡΡ‚ΡŒ имССтся число 9

НуТно ΡƒΠ·Π½Π°Ρ‚ΡŒ, выставлСн Π»ΠΈ Π±ΠΈΡ‚ Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 3 (начиная с нуля). Для этого ΡƒΠΌΠ½ΠΎΠΆΠΈΠΌ Π΅Π³ΠΎ Π½Π° число, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ всС Π±ΠΈΡ‚Ρ‹ Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ:

00001001 & 00001000 = 00001000

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠ·Π½Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΡ‚Π° Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 6

00001001 & 01000000 = 00000000

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚, Ρ€Π°Π²Π½Ρ‹ΠΉ Π½ΡƒΠ»ΡŽ, Ρ‚ΠΎ Π½Π° искомой ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ находится ноль, ΠΈΠ½Π°Ρ‡Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ число, состоящСС ΠΈΠ· Π½ΡƒΠ»Π΅ΠΉ с ΠΎΠ΄Π½ΠΈΠΌ Π±ΠΈΡ‚ΠΎΠΌ Π½Π° Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, сдвинСм 1 Π½Π° Π½ΡƒΠΆΠ½ΠΎΠ΅ число Π±ΠΈΡ‚ Π²Π»Π΅Π²ΠΎ.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ условиС записано Ρ‚Π°ΠΊ

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π±Π΅Π· скобок сначала Π±ΡƒΠ΄Π΅Ρ‚ вычислСно равСнство Π½ΡƒΠ»ΡŽ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ

Ѐункция, которая выставляСт Π±ΠΈΡ‚ Π½Π° n-ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ.

Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ логичСскоС слоТСниС любого Π±ΠΈΡ‚Π° с 1 Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ 1. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ для установки n-Π³ΠΎ Π±ΠΈΡ‚Π° Π½ΡƒΠΆΠ½ΠΎ логичСски ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ число с Ρ‚Π°ΠΊΠΈΠΌ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ всС Π±ΠΈΡ‚Ρ‹, ΠΊΡ€ΠΎΠΌΠ΅ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ, Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ. Как ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ число, ΡƒΠΆΠ΅ рассмотрСно.

Ѐункция, которая устанавливаСт Π±ΠΈΡ‚ Π½Π° n-ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² ноль.

Для этого Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Π±ΠΈΡ‚Ρ‹ числа, ΠΊΡ€ΠΎΠΌΠ΅ n-Π³ΠΎ, Π½Π΅ измСнились. Π£ΠΌΠ½ΠΎΠΆΠΈΠΌ число Π½Π° Ρ‚Π°ΠΊΠΎΠ΅, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ всС Π±ΠΈΡ‚Ρ‹ Ρ€Π°Π²Π½Ρ‹ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅, ΠΊΡ€ΠΎΠΌΠ΅ Π±ΠΈΡ‚Π° ΠΏΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ n. НапримСр

0001011 & 1110111 = 0000011

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ маску, сначала создадим число с нулями ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π³ΠΎ.

Ѐункция, ΠΈΠ·ΠΌΠ΅Π½ΡŽΡ‰Π°Ρ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n-Π³ΠΎ Π±ΠΈΡ‚Π° Π½Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠ΅.

Для этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ»ΠΈ: ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ XOR ΠΊ числу, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ состоит ΠΈΠ· ΠΎΠ΄Π½ΠΈΡ… Π½ΡƒΠ»Π΅ΠΉ ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Π½Π° мСстС Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°.

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ

Расммотрим синтСтичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€. ΠŸΡƒΡΡ‚ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ логичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ вывСсти ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² зависимости ΠΎΡ‚ всСх этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… сразу. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ 2 3 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ². Π—Π°ΠΏΠΈΡˆΠ΅ΠΌ это условиС Π² Π²ΠΈΠ΄Π΅ вСтвлСния:

ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ 8 Π²Π΅Ρ‚Π²Π΅ΠΉ. ΠŸΡƒΡΡ‚ΡŒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ понадобилось Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎ условиС. Π’ΠΎΠ³Π΄Π° число Π²Π΅Ρ‚Π²Π΅ΠΉ удвоится, ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° станСт Π΅Ρ‰Ρ‘ слоТнСй для понимания ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Если ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· Π½Π°ΡˆΠΈΡ… логичСсих Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ Π½Π° своё число Π±ΠΈΡ‚ Π²Π»Π΅Π²ΠΎ ΠΈ логичСски ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ свою ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Π±ΠΈΡ‚ Π² зависимоти ΠΎΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ a, b ΠΈ c:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ нашСй Π·Π°Π΄Π°Ρ‡Π΅ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π²Π΅Ρ‚Π²Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° switch:

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‡Π΅Π½ΡŒ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для назначСния ΠΎΠΏΡ†ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Ρ€Π°Π·Π½Ρ‹Ρ… языках программирования. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π»Π°Π³ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ своё ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π° ΠΈΡ… совмСстноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ логичСская сумма всСх ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ². НапримСр, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° fcntl:

Π—Π΄Π΅ΡΡŒ Ρ„Π»Π°Π³ O_RDWR Ρ€aΠ²Π΅Π½

00000000000000000000001000000000

ΠΈ O_APPEND

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π£Ρ€ΠΎΠΊ β„–45. ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

Обновл. 11 БСн 2021 |

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… этот ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ слоТным. Если Π²Ρ‹ застряли ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ понятно β€” пропуститС этот ΡƒΡ€ΠΎΠΊ (ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ), Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ смоТСтС Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ. Он Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ Π²Π°ΠΆΠ΅Π½ для прогрСсса Π² ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ языка C++, ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡƒΡ€ΠΎΠΊΠΈ, ΠΈ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ здСсь Π² большСй ΠΌΠ΅Ρ€Π΅ для ΠΎΠ±Ρ‰Π΅Π³ΠΎ развития.

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹?

Π’ Π΄Π°Π»Π΅ΠΊΠΎΠΌ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ памяти Π±Ρ‹Π»ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ ΠΈ Сю сильно Π΄ΠΎΡ€ΠΎΠΆΠΈΠ»ΠΈ. Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ стимулом максимально Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ доступный Π±ΠΈΡ‚. НапримСр, Π² логичСском Ρ‚ΠΈΠΏΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… bool Π΅ΡΡ‚ΡŒ всСго лишь Π΄Π²Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… значСния (true ΠΈ false), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСны ΠΎΠ΄Π½ΠΈΠΌ Π±ΠΈΡ‚ΠΎΠΌ, Π½ΠΎ ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Ρ†Π΅Π»Ρ‹ΠΉ Π±Π°ΠΉΡ‚ памяти! А это, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ адрСса памяти, Π° ΠΎΠ½ΠΈ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π±Π°ΠΉΡ‚Π°Ρ…. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ bool Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 1 Π±ΠΈΡ‚, Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ 7 Π±ΠΈΡ‚ β€” тратятся Π²ΠΏΡƒΡΡ‚ΡƒΡŽ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ позволят ΡƒΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ 8 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° bool Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 1 Π±Π°ΠΉΡ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сэкономит ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти. Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚Ρ€ΡŽΠΊ Π±Ρ‹Π» ΠΎΡ‡Π΅Π½ΡŒ популярСн. Но сСгодня, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π² ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, это Π½Π΅ Ρ‚Π°ΠΊ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ памяти стало сущСствСнно большС ΠΈ программисты ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ понятнСС Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ, Π½Π΅ΠΆΠ΅Π»ΠΈ ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π΄ΠΈ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ экономии памяти. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ спрос Π½Π° использованиС ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² нСсколько ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΡΡ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ случаСв, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΡƒΠΆ максимальная оптимизация (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°ΡƒΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ количСство Π΄Π°Π½Π½Ρ‹Ρ…; ΠΈΠ³Ρ€Ρ‹, Π³Π΄Π΅ манипуляции с Π±ΠΈΡ‚Π°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ скорости; встроСнныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π³Π΄Π΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π°).

Π’ языкС Π‘++ Π΅ΡΡ‚ΡŒ 6 ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²:

x

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π‘ΠΈΠΌΠ²ΠΎΠ» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ
ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²Π»Π΅Π²ΠΎ>x >> yВсС Π±ΠΈΡ‚Ρ‹ Π² x ΡΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π²ΠΏΡ€Π°Π²ΠΎ Π½Π° y Π±ΠΈΡ‚
ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ НЕВсС Π±ΠΈΡ‚Ρ‹ Π² x ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹Π΅
ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ И&x & yΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΠΈΡ‚ Π² x И ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΅ΠΌΡƒ Π±ΠΈΡ‚ Π² y
ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π˜Π›Π˜|x | yΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΠΈΡ‚ Π² x Π˜Π›Π˜ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΅ΠΌΡƒ Π±ΠΈΡ‚ Π² y
ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜ (XOR)^x ^ yΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΠΈΡ‚ Π² x XOR с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π΅ΠΌΡƒ Π±ΠΈΡ‚ΠΎΠΌ Π² y

Π’ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… опСрациях слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ цСлочислСнныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… unsigned, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ C++ Π½Π΅ всСгда Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² с цСлочислСнными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ signed.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ: ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ цСлочислСнныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… unsigned.

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²Π»Π΅Π²ΠΎ ( >)

Π’ языкС C++ количСство ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΡ‚ основываСтся Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… (Π² 1 Π±Π°ΠΉΡ‚Π΅ находятся 8 Π±ΠΈΡ‚). ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига Π²Π»Π΅Π²ΠΎ ( ) сдвигаСт Π±ΠΈΡ‚Ρ‹ Π²Π»Π΅Π²ΠΎ. Π›Π΅Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ являСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΡΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ, Π° ΠΏΡ€Π°Π²Ρ‹ΠΉ β€” количСство мСст, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ 3 ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π² Π²ΠΈΠ΄Ρƒ Β«ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ Π±ΠΈΡ‚Ρ‹ Π²Π»Π΅Π²ΠΎ Π² Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π΅ 3 Π½Π° ΠΎΠ΄Π½ΠΎ мСсто».

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с 4-Π±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌΠΈ значСниями.

Рассмотрим число 3, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ систСмС Ρ€Π°Π²Π½ΠΎ 0011:

Π’ послСднСм Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ случаС ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚ пСрСмСщаСтся Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ самого Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°! Π‘ΠΈΡ‚Ρ‹, сдвинутыС Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ числа, Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ навсСгда.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига Π²ΠΏΡ€Π°Π²ΠΎ ( >> ) сдвигаСт Π±ΠΈΡ‚Ρ‹ Π²ΠΏΡ€Π°Π²ΠΎ. НапримСр:

12 = 1100
12 >> 1 = 0110 = 6
12 >> 2 = 0011 = 3
12 >> 3 = 0001 = 1

Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ случаС ΠΌΡ‹ снова пСрСмСстили Π±ΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°. Он Ρ‚Π°ΠΊΠΆΠ΅ потСрялся навсСгда.

Π₯отя Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅, ΠΌΡ‹ смСщаСм Π±ΠΈΡ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°Ρ…, ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π±ΠΈΡ‚Ρ‹ ΠΈ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвигДанный ΡƒΡ€ΠΎΠΊ посвящён Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ опСрациям (опСрациям с Π±ΠΈΡ‚Π°ΠΌΠΈ, Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅, bitmath), ΠΈΠ· Π½Π΅Π³ΠΎ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π±ΠΈΡ‚Π°ΠΌΠΈ – элСмСнтарными ячСйками памяти ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°. ΠœΡ‹ ΡƒΠΆΠ΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ опСрациями Π² ΡƒΡ€ΠΎΠΊΠ΅ ΠΏΡ€ΠΎ рСгистры ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°, сСйчас рассмотрим всё максимально ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Данная Ρ‚Π΅ΠΌΠ° являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· самых слоТных для понимания Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠ³ΠΎ курса ΡƒΡ€ΠΎΠΊΠΎΠ², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ разбСрёмся, Π·Π°Ρ‡Π΅ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±ΠΈΡ‚Π°ΠΌΠΈ:

Π”Π°Π½Π½Ρ‹ΠΉ ΡƒΡ€ΠΎΠΊ основан Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΡƒΡ€ΠΎΠΊΠ΅ ΠΏΠΎ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ опСрациям ΠΎΡ‚ Arduino, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ здСсь – Ρ‚Π°ΠΌ всё описано Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.

Двоичная систСма ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…

2 Π² стСпСниDECBIN
010b00000001
120b00000010
240b00000100
380b00001000
4160b00010000
5320b00100000
6640b01000000
71280b10000000

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ Π΄Π²ΠΎΠΉΠΊΠΈ явно β€œΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚β€ Π½Π° Π½ΠΎΠΌΠ΅Ρ€ Π±ΠΈΡ‚Π° Π² Π±Π°ΠΉΡ‚Π΅, считая справа Π½Π°Π»Π΅Π²ΠΎ (ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Π°Ρ‡Π΅). Напомню, Ρ‡Ρ‚ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΉ систСмС исчислСния Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ – ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρƒ всё Ρ€Π°Π²Π½ΠΎ ΠΈ ΠΎΠ½ Π²ΠΎ всём Π²ΠΈΠ΄ΠΈΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ ΠΈ Π½ΡƒΠ»ΠΈ. Если β€œΡΠ»ΠΎΠΆΠΈΡ‚ΡŒβ€ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π±Π°ΠΉΡ‚ Π² дСсятичном прСдставлСнии Π±ΠΈΡ‚ΠΎΠ², Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π· 255: 128+64+32+16+8+4+2+1 = 255. НСтрудно Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ число 0b11000000 Ρ€Π°Π²Π½ΠΎ 128+64, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ 192. ИмСнно Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈ получаСтся вСсь Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ‚ 0 Π΄ΠΎ 255, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ умСщаСтся Π² ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚. Если Π²Π·ΡΡ‚ΡŒ Π΄Π²Π° Π±Π°ΠΉΡ‚Π° – Π±ΡƒΠ΄Π΅Ρ‚ всё Ρ‚ΠΎ ΠΆΠ΅ самоС, просто ячССк Π±ΡƒΠ΄Π΅Ρ‚ 16, Ρ‚ΠΎ ΠΆΠ΅ самоС для 4 Π±Π°ΠΉΡ‚ – 32 ячСйки с Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠΈ ΠΈ нулями, каТдая ΠΈΠΌΠ΅Π΅Ρ‚ свой Π½ΠΎΠΌΠ΅Ρ€ согласно стСпСни Π΄Π²ΠΎΠΉΠΊΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Ρ‘ΠΌ манипуляции с Π±ΠΈΡ‚Π°ΠΌΠΈ с самого простого – с ΠΌΠ°ΠΊΡ€ΠΎ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ΄ΡƒΡ‚ β€œΠ² комплСктС” с ядром Arduino.

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ для манипуляций с Π±ΠΈΡ‚Π°ΠΌΠΈ

Π’ β€œΠ±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅β€ Arduino.h Π΅ΡΡ‚ΡŒ нСсколько ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… макросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π±ΠΈΡ‚Ρ‹ Π² Π±Π°ΠΉΡ‚Π΅:

ΠœΠ°ΠΊΡ€ΠΎΡΡ‹ Arduino.hДСйствиС
bitRead(value, bit)Π§ΠΈΡ‚Π°Π΅Ρ‚ Π±ΠΈΡ‚ ΠΏΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ bit Π² числС value
bitSet(value, bit)Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ (ставит 1) Π±ΠΈΡ‚ ΠΏΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ bit Π² числС value
bitClear(value, bit)Π’Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ (ставит 0) Π±ΠΈΡ‚ ΠΏΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ bit Π² числС value
bitWrite(value, bit, bitvalue)Π‘Ρ‚Π°Π²ΠΈΡ‚ Π±ΠΈΡ‚ ΠΏΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ bit Π² состояниС bitvalue (0 ΠΈΠ»ΠΈ 1) Π² числС value
bit(bit)Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 2 Π² стСпСни bit
Π”Ρ€ΡƒΠ³ΠΈΠ΅ встроСнныС макросы
_BV(bit)Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 2 Π² стСпСни bit
bit_is_set(value, bit)ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΡΡ‚ΡŒ (1) Π±ΠΈΡ‚Π° bit Π² числС value
bit_is_clear(value, bit)ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΡΡ‚ΡŒ (0) Π±ΠΈΡ‚Π° bit Π² числС value

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Π±ΠΎΠ»Π΅Π΅ слоТным Π²Π΅Ρ‰Π°ΠΌ. На самом Π΄Π΅Π»Π΅ ΠΎΠ½ΠΈ максимально просты для ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°, Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ просты, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ‚Π°ΠΊΡ‚. ΠŸΡ€ΠΈ частотС 16 ΠœΠ“Ρ† (Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠ»Π°Ρ‚ Arduino) ΠΎΠ΄Π½Π° опСрация Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 0.0625 микросСкунды.

Π‘ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ И

И (AND), ΠΎΠ½ΠΎ ΠΆΠ΅ β€œΠ»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ умноТСниС”, выполняСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ & ΠΈΠ»ΠΈ and ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

ОсновноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ И – битовая маска. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ β€œΠ²Π·ΡΡ‚ΡŒβ€ ΠΈΠ· Π±Π°ΠΉΡ‚Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹:

Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ & ΠΌΡ‹ взяли ΠΈΠ· Π±Π°ΠΉΡ‚Π° 0b11001100 Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΠΈΡ‚Ρ‹ 10000111, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ – 0b11001100, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ 0b10000100 Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ составной ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ &=

Π‘ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π˜Π›Π˜

Π˜Π›Π˜ (OR), ΠΎΠ½ΠΎ ΠΆΠ΅ β€œΠ»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ слоТСниС”, выполняСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ | ΠΈΠ»ΠΈ or ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

ОсновноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π˜Π›Π˜ – установка Π±ΠΈΡ‚Π° Π² Π±Π°ΠΉΡ‚Π΅:

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ составной ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ |=

Π’Ρ‹ ΡƒΠΆΠ΅ поняли, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π½ΡƒΠΆΠ½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π»ΡŽΠ±Ρ‹ΠΌ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ способом: Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ (0b00000001 – Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±ΠΈΡ‚), Π² дСсятичном Π²ΠΈΠ΄Π΅ (16 – Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚Ρ‹ΠΉ Π±ΠΈΡ‚) ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ макросов bit() ΠΈΠ»ΠΈ _BV() ( bit(7) Π΄Π°Ρ‘Ρ‚ 128 ΠΈΠ»ΠΈ 0b10000000, _BV(7) Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС)

Π‘ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ НЕ

Битовая опСрация НЕ (NOT) выполняСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ

ΠΈ просто ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π±ΠΈΡ‚:

Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚:

Π‘ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜

Битовая опСрация ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜ (XOR) выполняСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ^ ΠΈΠ»ΠΈ xor ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Данная опСрация ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для инвСртирования состояния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°:

Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ взяли Π±ΠΈΡ‚ β„–7 Π² Π±Π°ΠΉΡ‚Π΅ 0b11001100 ΠΈ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ Π΅Π³ΠΎ Π² 0, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ 0b01001100, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ Π½Π΅ Ρ‚Ρ€ΠΎΠ³Π°Π»ΠΈ.

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅ Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ΅, ΠΊΠ°ΠΊ ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ ΠΈΠ»ΠΈ Π΄Π΅Π»ΠΈΡ‚ Π±Π°ΠΉΡ‚ Π½Π° 2 Π² стСпСни. Π”Π°, это опСрация дСлСния, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°ΡΡΡ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ‚Π°ΠΊΡ‚ процСссора! К этому ΠΌΡ‹ Π΅Ρ‰Ρ‘ вСрнёмся Π½ΠΈΠΆΠ΅. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° сдвига ΠΈ сравнитС Π΅Ρ‘ с макросами bit() ΠΈ _BV() :

Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ-Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ

Вспомним ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΠΏΡƒΠ½ΠΊΡ‚Π° ΠΏΡ€ΠΎ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π˜Π›Π˜, ΠΏΡ€ΠΎ установку Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°. Π’ΠΎΡ‚ эти Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΊΠΎΠ΄Π° Π΄Π΅Π»Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅:

Как насчёт установки Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±ΠΈΡ‚ сразу?

Или ΠΏΡ€ΠΈΡ†Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΈΡ‚? Π’ΡƒΡ‚ Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ &= ΠΈ

Π’Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ нСсколько Π±ΠΈΡ‚ сразу? ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°!

ИмСнно Ρ‚Π°ΠΊΠΈΠ΅ конструкции Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ΄Π΅ высокого уровня ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…, ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ производится Ρ€Π°Π±ΠΎΡ‚Π° с рСгистрами ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°. ВСрнёмся ΠΊ устройству Ардуиновских макросов:

Π― Π΄ΡƒΠΌΠ°ΡŽ, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ излишни: макросы состоят ΠΈΠ· Ρ‚Π΅Ρ… ΠΆΠ΅ элСмСнтарных Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ сдвигов!

БыстрыС вычислСния

Как я ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ – самыС быстрыС. Если трСбуСтся максимальная ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ вычислСний – ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ΄ΠΎΠ³Π½Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ β€œΡΡ‚Π΅ΠΏΠ΅Π½ΠΈ двойки”, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° компилятор Π΄Π΅Π»Π°Π΅Ρ‚ это сам, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ смотри Π² ΡƒΡ€ΠΎΠΊΠ΅ ΠΏΡ€ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π°. Рассмотрим Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: рассмотрСнныС Π²Ρ‹ΡˆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с цСлочислСнными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…!

Экономия памяти

ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ памяти, пакуя Π΄Π°Π½Π½Ρ‹Π΅ Π² Π±Π»ΠΎΠΊΠΈ. НапримСр, пСрСмСнная Ρ‚ΠΈΠΏΠ° boolean Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π² памяти 8 Π±ΠΈΡ‚, хотя ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 0 ΠΈ 1. Π’ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ 8 логичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

Π•Ρ‰Ρ‘ интСрСсный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сТатия

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ отбросили Ρƒ красного ΠΈ синСго младшиС (ΠΏΡ€Π°Π²Ρ‹Π΅) Π±ΠΈΡ‚Ρ‹, Π² этом ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ сТатиС. Π§Π΅ΠΌ большС Π±ΠΈΡ‚ΠΎΠ² ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ – Ρ‚Π΅ΠΌ ΠΌΠ΅Π½Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ получится β€œΡ€Π°Π·ΠΆΠ°Ρ‚ΡŒβ€ число. НапримСр сТимали число 0b10101010 (170 Π² дСсятичной) Π½Π° Ρ‚Ρ€ΠΈ Π±ΠΈΡ‚Π°, ΠΏΡ€ΠΈ сТатии ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ 0b10101000, Ρ‚.Π΅. потСряли Ρ‚Ρ€ΠΈ ΠΌΠ»Π°Π΄ΡˆΠΈΡ… Π±ΠΈΡ‚Π°, ΠΈ Π² дСсятичной ΡƒΠΆΠ΅ получится 168. Для ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг ΠΈ маска, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ Π±Π΅Ρ€Ρ‘ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΏΡΡ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ² красного, ΡˆΠ΅ΡΡ‚ΡŒ Π·Π΅Π»Ρ‘Π½ΠΎΠ³ΠΎ ΠΈ ΠΏΡΡ‚ΡŒ синСго, ΠΈ Π·Π°Π΄Π²ΠΈΠ³Π°Π΅ΠΌ Π½Π° Π½ΡƒΠΆΠ½Ρ‹Π΅ мСста Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ 16-Π±ΠΈΡ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Всё, Ρ†Π²Π΅Ρ‚ сТат ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ. Для распаковки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ обратная опСрация: Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ маски Π½ΡƒΠΆΠ½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ ΠΈ сдвигаСм ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Π±Π°ΠΉΡ‚:

Как ΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ со свСтодиодами, ΠΌΡ‹ просто Π±Ρ€Π°Π»ΠΈ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ ( Π² этом случаС младшиС Π΄Π²Π°, 0b11 ) ΠΈ сдвигали ΠΈΡ… Π½Π° Π½ΡƒΠΆΠ½ΠΎΠ΅ расстояниС. Для распаковки Π΄Π΅Π»Π°Π΅ΠΌ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС:

И ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ наши Π±Π°ΠΉΡ‚Ρ‹. Π’Π°ΠΊΠΆΠ΅ маску ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ запись, Π·Π°Π΄Π²ΠΈΠ½ΡƒΠ² 0b11 Π½Π° Π½ΡƒΠΆΠ½ΠΎΠ΅ расстояниС:

Ну ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, прослСдив Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для сСбя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ макрос чтСния ΠΏΠ°ΠΊΠ΅Ρ‚Π°:

Π“Π΄Π΅ x это ΠΏΠ°ΠΊΠ΅Ρ‚, Π° y – порядковый Π½ΠΎΠΌΠ΅Ρ€ Π·Π°ΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ значСния. Π’Ρ‹Π²Π΅Π΄Π΅ΠΌ посмотрим:

β€œΠ’Ρ€ΡŽΠΊΠΈβ€ с Π±ΠΈΡ‚Π°ΠΌΠΈ

На Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… опСрациях ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ всСго интСрСсного, ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ быстро ΠΈ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΌΠ°Π»ΠΎ мСста. ΠžΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ список Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… Ρ‚Ρ€ΡŽΠΊΠΎΠ² ΠΈ Ρ…Π°ΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, ΠΈΡ… Ρ‚Π°ΠΌ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ всС с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ. Π•ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ нСбольшой сборник самых простых ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ…Π°ΠΊΠΎΠ² Π²ΠΎΡ‚ здСсь (английский). Π•Π³ΠΎ я ΠΏΠ΅Ρ€Π΅Π²Ρ‘Π», смотритС Π½ΠΈΠΆΠ΅ ΠΏΠΎΠ΄ спойлСром. Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° (ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ всС Ρ‚Ρ€ΡŽΠΊΠΈ) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ здСсь.

ΠŸΠ΅Ρ€Π΅ΠΌΠΎΡ‚ΠΊΠ° Π±ΠΈΡ‚Π°

Π¦Π΅Π»Ρ‹Π΅

Установка n Π³ΠΎ Π±ΠΈΡ‚Π°

Π’Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ n Π³ΠΎ Π±ΠΈΡ‚Π°

Π˜Π½Π²Π΅Ρ€ΡΠΈΡ n Π³ΠΎ Π±ΠΈΡ‚Π°

ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ блиТайшСй стСпСни Π΄Π²ΠΎΠΉΠΊΠΈ

ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ Π²Π½ΠΈΠ·

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ максимального Ρ†Π΅Π»ΠΎΠ³ΠΎ

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ минимального Ρ†Π΅Π»ΠΎΠ³ΠΎ

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ максимального long

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° 2

Π”Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 2

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° m ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ Π΄Π²ΠΎΠΉΠΊΠΈ

Π”Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° m ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ Π΄Π²ΠΎΠΉΠΊΠΈ

ΠžΡΡ‚Π°Ρ‚ΠΎΠΊ ΠΎΡ‚ дСлСния

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° равСнства

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Ρ‡Ρ‘Ρ‚Π½ΠΎΡΡ‚ΡŒ (ΠΊΡ€Π°Ρ‚Π½ΠΎΡΡ‚ΡŒ 2)

ОбмСн значСниями

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ³ΠΎ значСния

ΠœΠ°ΠΊΡΠΈΠΌΡƒΠΌ ΠΈΠ· Π΄Π²ΡƒΡ…

ΠœΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈΠ· Π΄Π²ΡƒΡ…

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Π·Π½Π°ΠΊ

Π‘ΠΌΠ΅Π½Π° Π·Π½Π°ΠΊΠ°

Π’Π΅Ρ€Π½Ρ‘Ρ‚ 2 n

ЯвляСтся Π»ΠΈ число ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ 2

ΠžΡΡ‚Π°Ρ‚ΠΎΠΊ ΠΎΡ‚ дСлСния Π½Π° 2 n Π½Π° m

Π‘Ρ€Π΅Π΄Π½Π΅Π΅ арифмСтичСскоС

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ m Ρ‹ΠΉ Π±ΠΈΡ‚ ΠΈΠ· n (ΠΎΡ‚ младшСго ΠΊ ΡΡ‚Π°Ρ€ΡˆΠ΅ΠΌΡƒ)

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ m Ρ‹ΠΉ Π±ΠΈΡ‚ ΠΈΠ· n (ΠΎΡ‚ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ ΠΊ ΠΌΠ»Π°Π΄ΡˆΠ΅ΠΌΡƒ)

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π»ΠΈ n Ρ‹ΠΉ Π±ΠΈΡ‚

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ самого ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ самого ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°

n + 1

n – 1

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния

if (x == a) x = b; if (x == b) x = a;

ΠŸΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ смСТныС Π±ΠΈΡ‚Ρ‹

Different rightmost bit of numbers m & n

Common rightmost bit of numbers m & n

ДСсятичныС Π΄Ρ€ΠΎΠ±ΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Ρ…Π°ΠΊΠΈ с float ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° Ардуино! Π Π°Π·Π±ΠΈΡ‚ΡŒ float Π² массив Π±ΠΈΡ‚ (unsigned uint32_t)

Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ массив Π±ΠΈΡ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² float

Быстрый ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΡ€Π΅Π½ΡŒ

Быстрый n Ρ‹ΠΉ ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΈΠ· Ρ†Π΅Π»ΠΎΠ³ΠΎ числа

Быстрая ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ

Быстрый Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π»ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌ

Быстрая экспонСнта

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ

ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½ΠΈΠΆΠ½ΠΈΠΉ рСгистр

ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр

Π˜Π½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ рСгистр

ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ Π±ΡƒΠΊΠ²Ρ‹ Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅ (Π°Π½Π³Π»)

ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ большой Π±ΡƒΠΊΠ²Ρ‹ Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅ (Π°Π½Π³Π»)

ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ строчной Π±ΡƒΠΊΠ²Ρ‹ Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅ (Π°Π½Π³Π»)

Π”Ρ€ΡƒΠ³ΠΎΠ΅

Быстрая конвСртация Ρ†Π²Π΅Ρ‚Π° R5G5B5 Π² R8G8B8

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠ»ΠΎΠ΄ΠΈΡ‚ΡŒ скобки, Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π’ C++ ΠΎΠ½ Ρ‚Π°ΠΊΠΎΠΉ:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *