Π‘ Ρ€Π°Π±ΠΎΡ‚Π° с Π±ΠΈΡ‚Π°ΠΌΠΈ: C/C++ Π Π°Π±ΠΎΡ‚Π° с Π±ΠΈΡ‚Π°ΠΌΠΈ β€” volstr.ru

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² C++: И, Π˜Π›Π˜, НЕ ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜ | Π£Ρ€ΠΎΠΊΠΈ Π‘++

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3 = 0011
3 << 1 = 0110 = 6
3 << 2 = 1100 = 12
3 << 3 = 1000 = 8

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

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

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

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

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

unsigned int x = 4;
x = x << 1; // x Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Ρ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ΠΌ 8

unsigned int x = 4;

x = x << 1; // x Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Ρ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ΠΌ 8

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ сдвигами Π² Ρ€Π°Π·Π½Ρ‹Ρ… компиляторах ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ.

Π§Ρ‚ΠΎ!? Π Π°Π·Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ << ΠΈ >> ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π΅ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Π²Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ…?

И для этого Ρ‚ΠΎΠΆΠ΅.

БСйчас польза ΠΎΡ‚ использования ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π½Π΅ Ρ‚Π°ΠΊ Π²Π΅Π»ΠΈΠΊΠ°, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅. БСйчас Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига Π²Π»Π΅Π²ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ…. НапримСр, рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

#include <iostream>

int main()
{
unsigned int x = 4;
x = x << 1; // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ << ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига Π²Π»Π΅Π²ΠΎ
std::cout << x; // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ << ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ… Π² консоль

return 0;
}

#include <iostream>

int main()

{

Β Β Β Β unsigned int x = 4;

Β Β Β Β x = x << 1; // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ << ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига Π²Π»Π΅Π²ΠΎ

Β Β Β Β std::cout << x; // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ << ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ… Π² консоль

Β Β Β Β return 0;

}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

8

А ΠΊΠ°ΠΊ компилятор ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига Π²Π»Π΅Π²ΠΎ, Π° ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅? Всё ΠΎΡ‡Π΅Π½ΡŒ просто. std::cout пСрСопрСдСляСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° << ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° Π½ΠΎΠ²ΠΎΠ΅ (Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… Π² консоль). Когда компилятор Π²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π»Π΅Π²Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° << являСтся std::cout, Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ…. Если Π»Π΅Π²Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ являСтся пСрСмСнная цСлочислСнного Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ компилятор ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²Π»Π΅Π²ΠΎ (опСрация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ).

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ НЕ

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ НЕ (~), ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, самый простой для объяснСния ΠΈ понимания. Он просто мСняСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΠΈΡ‚ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с 0 Π½Π° 1 ΠΈΠ»ΠΈ с 1 Π½Π° 0. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ НЕ зависят ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…!

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… составляСт 4 Π±ΠΈΡ‚Π°:

4 = 0100
~ 4 = 1011 (Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅) = 11 (дСсятичноС)

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… составляСт 8 Π±ΠΈΡ‚:

4 = 0000 0100
~ 4 = 1111 1011 (Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅) = 251 (дСсятичноС)

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ И, Π˜Π›Π˜ ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜ (XOR)

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ И (&) ΠΈ Π˜Π›Π˜ (|) Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ логичСским ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ И ΠΈ Π˜Π›Π˜. Однако, ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π±ΠΈΡ‚Ρƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ! НапримСр, рассмотрим Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 5 | 6. Π’ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ систСмС это 0101 | 0110. Π’ любой ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ всСго Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

0 1 0 1 // 5
0 1 1 0 // 6

А Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ столбцу с Π±ΠΈΡ‚Π°ΠΌΠΈ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Как Π²Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, логичСскоС Π˜Π›Π˜ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true (1), Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΈΠ»ΠΈ ΠΎΠ±Π° ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ истинны (1). Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π˜Π›Π˜. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 5 | 6 обрабатываСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

0 1 0 1 // 5
0 1 1 0 // 6
-------
0 1 1 1 // 7

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

0111 (Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅) = 7 (дСсятичноС)

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ комплСксныС выраТСния Π˜Π›Π˜, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 1 | 4 | 6. Если Ρ…ΠΎΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚ Π² столбцС Ρ€Π°Π²Π΅Π½ 1, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ†Π΅Π»ΠΎΠ³ΠΎ столбца β€” 1. НапримСр:

0 0 0 1 // 1
0 1 0 0 // 4
0 1 1 0 // 6
--------
0 1 1 1 // 7

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ 1 | 4 | 6 являСтся дСсятичноС 7. 7. Если Π΅Π΄ΠΈΠ½ΠΈΡ† Π² столбцС Ρ‡Ρ‘Ρ‚Π½ΠΎΠ΅ количСство, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ 0, Ссли ΠΆΠ΅ Π½Π΅Ρ‡Ρ‘Ρ‚Π½ΠΎΠ΅ количСство, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” 1. НапримСр:

0 0 0 1 // 1
0 0 1 1 // 3
0 1 1 1 // 7
--------
0 1 0 1 // 5

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присваивания

Как ΠΈ Π² случаС с арифмСтичСскими ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ присваивания, язык C++ прСдоставляСт ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присваивания для облСгчСния внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π‘ΠΈΠΌΠ²ΠΎΠ»ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ
ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ сдвигом Π²Π»Π΅Π²ΠΎ<<=x <<= yΠ‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ Π±ΠΈΡ‚Ρ‹ Π² x Π²Π»Π΅Π²ΠΎ Π½Π° y Π±ΠΈΡ‚
ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ сдвигом вправо>>=x >>= yΠ‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ Π±ΠΈΡ‚Ρ‹ Π² x Π²ΠΏΡ€Π°Π²ΠΎ Π½Π° y Π±ΠΈΡ‚
ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉΒ Π˜Π›Π˜|=x |= yΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° выраТСния x | y ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x
ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ И&=x &= yΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° выраТСния x & y ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x
ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ Π˜Π›Π˜^=x ^= yΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° выраТСния x ^ y ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x

НапримСр, вмСсто Ρ… = Ρ… << 1; ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ… <<= 1;. 12:

0 1 0 1
1 1 0 0
--------
1 0 0 1 // 9 (дСсятичноС)

ΠžΡ†Π΅Π½ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ:

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ°…

ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях:

Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ — Π‘ΠΈΡ‚Ρ‹ Π½Π° C++ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π°.

@Atom, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽ Π½Π° вопросы:

1. const int S=8*sizeof(int)-1; — ΡƒΠ·Π½Π°Π΅ΠΌ сколько Π±ΠΈΡ‚ Π½ΡƒΠΆΠ½ΠΎ для Ρ†Π΅Π»ΠΎΠ³ΠΎ Π±Π΅Π· Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊ?

НСт. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π±ΠΈΡ‚ Π² int это S+1, Π° S это ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ Π±ΠΈΡ‚Π° Π² int.

2. const int M=1<<S; — сдвинули 32 Π±ΠΈΡ‚Π° Π²Π»Π΅Π²ΠΎ Π½Π° 1 Π±ΠΈΡ‚, Ссли Π΄Π° Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ сдвигаСм Π±ΠΈΡ‚Ρ‹, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ оставляСм ΠΈΡ… Π½Π° мСстС, ΠΊΠ°ΠΊ это ΠΏΠΎΠ½ΡΡ‚ΡŒ?

Π”Π°, сдвигаСм всС Π±ΠΈΡ‚Ρ‹ Π²Π»Π΅Π²ΠΎ, Π±ΠΈΡ‚ 0 становится Π½ΡƒΠ»Π΅ΠΌ. НапримСр

x: 10010000 00001000 10101111 100000001 послС x<<=1 прСвратится Π²
   00100000 00010001 01011111 000000010

ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ для нашСго ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с S ΠΈ М

S=8*sizeof(int)-1; // S = 31
M=1<<S;  
1:     00000000 00000000 00000000 00000001
1<<31: 10000000 00000000 00000000 00000000

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π½Π΅ оставляСм Π±ΠΈΡ‚Ρ‹ Π½Π° мСстС? ΠžΡ‡Π΅Π½ΡŒ просто, Π½Π°ΠΌ это Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

Π§Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π° самом Π΄Π΅Π»Π΅? ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΡ‚Π° Ρ†Π΅Π»ΠΎΠ³ΠΎ числа Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ n (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 2). Для этого ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ AND (опСрация & Π² C/C++).

v = 266  :    00000000 00000000 00000001 00001010 // Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΠΈΡ‚ 2 это 0
1        :    00000000 00000000 00000000 00000001 // число 1, Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ 1 << 2
M = 1<<2 :    00000000 00000000 00000000 00000100 // сдвинули
v & M    :    00000000 00000000 00000000 00000000 // число 0 Ρ‚.Π΅. Π±ΠΈΡ‚ 2 Π±Ρ‹Π» 0

3. x<<=1 if(x&M) { cout<<1;} else {cout<<0;}

      for (int i = 0, x = 1; i < sizeof(v)*8; i++, x <<= 1)
          if (v & x)
              cout << "bit "<<i<<" is set\n";

Π­Ρ‚ΠΎ ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ числа v установлСны (Π² 1). По шагам:

x = 1,  i = 0, v = 266
v:    00000000 00000000 00000001 00001010
x:    00000000 00000000 00000000 00000001
v&x:  00000000 00000000 00000000 00000000 // Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ
x << 1, i = 1, v = 266
v:    00000000 00000000 00000001 00001010
x:    00000000 00000000 00000000 00000010
v&x:  00000000 00000000 00000000 00000010 // cout << "bit 1 is set"
x << 1, i = 2, v = 266 
v:    00000000 00000000 00000001 00001010
x:    00000000 00000000 00000000 00000100
v&x:  00000000 00000000 00000000 00000000 // Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ
x << 1, i = 3, v = 266
v:    00000000 00000000 00000001 00001010
x:    00000000 00000000 00000000 00001000
v&x:  00000000 00000000 00000000 00001000 // cout << "bit 3 is set"

ΠΈ Ρ‚.Π΄. ВсС 32 шага Ρ€Π°ΡΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Ρƒ. НадСюсь Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ понятно. Π§Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ — ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°ΠΉΡ‚Π΅.

PostgreSQL : ДокумСнтация: 9.6: 9.6. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ строками : Компания Postgres Professional

9.6. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ строками

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ строками, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠΎΠ² bit ΠΈ bit varying. Помимо ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² сравнСния, с Ρ‚Π°ΠΊΠΈΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, пСрСчислСнныС Π² Π’Π°Π±Π»ΠΈΡ†Π΅Β 9.13. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ &, | ΠΈ # Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌΠΈ строками ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ Π΄Π»ΠΈΠ½Ρ‹ исходных строк, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ….

Π’Π°Π±Π»ΠΈΡ†Π° 9.13. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ строками

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
||конкатСнацияB'10001' || B'011'10001011
&Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ ANDB'10001' & B'01101'00001
|Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ ORB'10001' | B'01101'11101
#Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ XORB'10001' # B'01101'11100
~Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ NOT~ B'10001'01110
<<Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²Π»Π΅Π²ΠΎB'10001' << 301000
>>Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²ΠΏΡ€Π°Π²ΠΎB'10001' >> 200100

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ языка SQL Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ°ΠΊ с ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊ ΠΈ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ строками: length, bit_length, octet_length, position, substring, overlay.

Π‘ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌΠΈ строками Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get_bit ΠΈ set_bit. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ строками эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠΌΠ΅Ρ€ΡƒΡŽΡ‚ Π±ΠΈΡ‚Ρ‹ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ ΠΈ самый Π»Π΅Π²Ρ‹ΠΉ Π±ΠΈΡ‚ считаСтся Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ†Π΅Π»Ρ‹Π΅ значСния ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ‚ΠΈΠΏ bit ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. НапримСр:

44::bit(10)                    0000101100
44::bit(3)                     100
cast(-44 as bit(12))           111111010100
'1110'::bit(4)::integer        14

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ Ρ‚ΠΈΠΏΡƒ Β«bitΒ» Π±Π΅Π· Π΄Π»ΠΈΠ½Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ bit(1), ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Π½Π΅Π΅ Π·Π½Π°Ρ‡Π°Ρ‰ΠΈΠΉ Π±ΠΈΡ‚ числа.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа ΠΊ Ρ‚ΠΈΠΏΡƒ bit(n) ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€Π°Π²Ρ‹Π΅ n Π±ΠΈΡ‚ числа. Если ΠΆΠ΅ Ρ†Π΅Π»ΠΎΠ΅ прСобразуСтся Π² Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ строку большСй Π΄Π»ΠΈΠ½Ρ‹, Ρ‡Π΅ΠΌ трСбуСтся для этого числа, ΠΎΠ½Π° дополняСтся слСва Π±ΠΈΡ‚Π°ΠΌΠΈ Π·Π½Π°ΠΊΠ° числа.

НачинаСм ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ STM32: Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ / Π₯Π°Π±Ρ€

НСбольшоС отступлСниС…

Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ ΡƒΡ€ΠΎΠΊΠ΅ ΠΌΡ‹ рассмотрСли с Ρ‡Π΅Π³ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ссли Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ STM32: ΠΊΠ°ΠΊ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ IDE, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ простой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ ΠΊΠ°ΠΊ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ПослС полюбовались Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠΈΠ³ΠΈΠ²Π°Π½ΠΈΠ΅ свСтодиодов Π½Π° Discovery-ΠΏΠ»Π°Ρ‚Π΅ )

Начиная Π½ΠΎΠ²ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ, я Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π» сразу ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΌΡƒ Ρ€Π°Π·Π±ΠΎΡ€Ρƒ листинга ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ заставлял ΠΏΠΎΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠΈΠ³ΠΈΠ²Π°Ρ‚ΡŒΡΡ наши свСтодиоды, Π½ΠΎ ΡƒΠΆΠ΅ пСрСйдя ΠΊ написанию, я Π²Π΄Ρ€ΡƒΠ³ осознал для сСбя, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ большоС количСство вопросов Π±Π΅Π· ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ β€” ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. И для сСбя я ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» Ρ†Π΅Π»Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ Ρ‚Π°ΠΊΠΈΡ… вопросов:

  1. Π§Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ? Как ΠΈΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ?
  2. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ рСгистры ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ связаны с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ опСрациями?
  3. Из Ρ‡Π΅Π³ΠΎ состоят ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ STM32F0xx-сСрии, ΠΊΠ°ΠΊ осущСствляСтся Ρ‚Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Ρ‡Π΅ΠΌ обСспСчСна Тизнь Π²Π½ΡƒΡ‚Ρ€ΠΈ МК?
  4. Как происходит стартовая инициализация МК, Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ΅Π½ startup-Ρ„Π°ΠΉΠ», Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ функция SystemInit? ОбъяснСниС Π½Π° ΠΏΠ°Π»ΡŒΡ†Π°Ρ….
  5. Из Ρ‡Π΅Π³ΠΎ состоит Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° CMSIS? Как Π² Π½Π΅ΠΉ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ? Π§Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ· Π½Π΅Π΅ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈ ΠΊΠ°ΠΊ Π΅ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ?

ИмСнно с рассмотрСния этих вопросов я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ повСствованиС ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ STM32.

Бписок статСй:

  1. НачинаСм ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ STM32 ΠΈΠ»ΠΈ УправляСм свСтом ΠΏΠΎ-ΡƒΠΌΠ½ΠΎΠΌΡƒ
  2. НачинаСм ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ STM32: Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
  3. НачинаСм ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ STM32: Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ рСгистры? Как с Π½ΠΈΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ?

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

Волько начиная ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹, слова «рСгистр» ΠΈ Β«Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΒ» для мСня казались Ρ‡Π΅ΠΌ-Ρ‚ΠΎ таинствСнно Π·Π°Π³Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΌ ΠΈ я Π΄ΠΎΠ»Π³ΠΎ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π» ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΡ‹. Но ΠΊΠΎΠ³Π΄Π° я Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ разобрался с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅ я понял Ρ‡Ρ‚ΠΎ зря ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π» ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°ΠΆΠ½ΠΎΠΉ Ρ‚Π΅ΠΌΡ‹ Π² дальний ящик. Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅ самыС распространСнныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ ΠΈ Π·Π½Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π² нашСй Ρ€Π°Π±ΠΎΡ‚Π΅ β€” ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» возмоТностСй для управлСния всСм ΠΈ вся Π² нашСм МК!

ВсС ΠΌΡ‹ Π½Π° ΡƒΡ€ΠΎΠΊΠ°Ρ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π² школС знакомились с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ цифровая Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½Π° Ρ‚Π°ΠΊ называСтся, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ основныС логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.ВсС соврСмСнныС Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ основаны Π½Π° Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ ΠΈ логичСских схСмах.

ΠœΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ всСгда ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ двумя состояниями: «ноль» β€” Π½Π΅Ρ‚ напряТСния, Β«Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Β» β€” Π΅ΡΡ‚ΡŒ напряТСниС. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ освСТим Π² Π³ΠΎΠ»ΠΎΠ²Π΅ знания ΠΎ основных логичСских опСрациях Ρ‚.ΠΊ. ΠΎΠ½ΠΈ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ основу всСй Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ.

  • ΠšΠΎΠ½ΡŠΡŽΠ½ΠΊΡ†ΠΈΡ β€” обозначаСтся ΠΊΠ°ΠΊ «ЛогичСскоС И» ΠΈΠ»ΠΈ «ЛогичСскоС ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅Β». Π’ сущности, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΡ‚ выполнСния Π΄Π°Π½Π½ΠΎΠΉ логичСской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π΄Π²ΡƒΡ… для Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ А ΠΈ Π’ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΈΡ… ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡŽ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«1Β» Π² случаС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΈ А, ΠΈ Π’ ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«1Β». Π’ΠΎ всСх Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«0Β». ΠœΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ И, &&, AND, &
  • Π”ΠΈΠ·ΡŠΡŽΠ½ΠΊΡ†ΠΈΡ β€” обозначаСтся ΠΊΠ°ΠΊ «ЛогичСскоС Π˜Π›Π˜Β» ΠΈΠ»ΠΈ «ЛогичСскоС слоТСниС». Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΡ‚ выполнСния Π΄Π°Π½Π½ΠΎΠΉ логичСской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π΄Π²ΡƒΡ… для Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ А ΠΈ Π’ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΈΡ… слоТСнию. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«1Β» Π² случаС Ссли хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ А ΠΈ Π’ ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«1Β»..

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

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ β€” практичСски Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ лишь с Ρ‚ΠΎΠΉ Ρ€Π°Π·Π½ΠΈΡ†Π΅ΠΉ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ ΠΊ Π±ΠΈΡ‚Π°ΠΌ ΠΈ ΠΊ числам Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ систСмы.

К слову говоря, для простоты изучСния Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ я использовал ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ 32-bit ASM Calculator ΠΎΡ‚ ManHunter. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выполнСния Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ числа ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ систСмы счислСния Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятный интСрфСйс ΠΈ послС знакомства ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° стала ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· основных инструмСнтов Π² ΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°ΠΌΠΈ. НСбольшоС пояснСниС ΠΊ интСрфСйсу ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Π°Π½Π½ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½ΠΈΠΆΠ΅:

Битовая опСрация «НЕ» β€” «~»

Если Π±ΠΈΡ‚ Ρ€Π°Π²Π΅Π½ Β«1Β», Ρ‚ΠΎ послС выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ «НЕ» ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ Β«0Β», ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ сразу ΠΆΠ΅ выполняСтся Π½Π°Π΄ всСми Π±ΠΈΡ‚Π°ΠΌΠΈ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ числа. НапримСр, ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ число FF:

Битовая опСрация «И» β€” «&»

Если ΠΎΠ±Π° Π±ΠΈΡ‚Π° Π² разрядС Ρ€Π°Π²Π½Ρ‹ Β«1Β», Ρ‚ΠΎ послС выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ «И» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² разрядС Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ Β«1Β», Π½ΠΎ Ссли хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π±ΠΈΡ‚ΠΎΠ² Ρ€Π°Π²Π΅Π½ Β«0Β» Ρ‚ΠΎΠ³Π΄Π° ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ Β«0Β». ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ Ρ‚Π°ΠΊ ΠΆΠ΅ выполняСтся поразрядно. НапримСр, Β«ΡƒΠΌΠ½ΠΎΠΆΠΈΠΌΒ» Π΄Π²Π° числа 0xFF0 ΠΈ 0xF0F:

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π΅Ρ… разрядах Π³Π΄Π΅ Π±Ρ‹Π»ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Π² ΠΎΠ±ΠΎΠΈΡ… числах, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, Π²ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях β€” Π½ΡƒΠ»ΠΈ.

Рассмотрим Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ практичСского примСнСния:

  • Π’ ситуации, Ссли Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π±ΠΈΡ‚ ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΡƒ Π±ΠΈΡ‚ΠΎΠ² Π² ноль ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ маску. Π”ΡƒΠΌΠ°ΡŽ, Π±ΡƒΠ΄Π΅Ρ‚ нагляднСС ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ это Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Допустим, ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ число ΠΈ 0xF8F ΠΈ Π½Π°ΠΌ Π½Π°Π΄ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ 7-ΠΉ Π±ΠΈΡ‚ стал вмСсто Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Π½ΡƒΠ»Π΅ΠΌ. НСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π½Π°ΠΊΠΈΠ΄Ρ‹Π²Π°Π΅ΠΌ маску ΠΈ снимаСм Π³Π°Π»ΠΎΡ‡ΠΊΡƒ с Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°. Π£ΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ числа ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:
  • Если Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π±ΠΈΡ‚ Π² числС Π½Π° 0 ΠΈΠ»ΠΈ 1 β€” ΠΌΡ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ маску ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ маскС ΠΌΡ‹ устанавливаСм Π±ΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ. Если Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Π±ΠΈΡ‚ Ρ€Π°Π²Π΅Π½ Β«0Β» β€” Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ вычислСния Π±ΡƒΠ΄Π΅Ρ‚ Β«0Β», Ссли Β«1Β» Ρ‚ΠΎ, соотвСтствСнно, Β«1Β». Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ€Π°Π²Π΅Π½ Π»ΠΈ 7-ΠΉ Π±ΠΈΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ β€” Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ маску ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ нашС число Π½Π° маску. ВсС просто:


    Если Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ‚Π½ΠΎΡΡ‚ΡŒ числа(имССтся Π²Π²ΠΈΠ΄Ρƒ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ числа Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π½Π° Π΄Π²Π°) β€” Ρ‚ΠΎ ΠΌΡ‹ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ провСряСм 1-ΠΉ Π±ΠΈΡ‚, Ссли ΠΎΠ½ Ρ€Π°Π²Π΅Π½ Β«1Β» β€” Ρ‚ΠΎ число Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅, Ссли Ρ‚Π°ΠΌ Β«0Β» Ρ‚ΠΎ число Ρ‡Π΅Ρ‚Π½ΠΎΠ΅. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ сами, Π² цСлях обучСния ΠΈ формирования Π½Π°Π²Ρ‹ΠΊΠΎΠ², ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ.

Битовая опСрация Β«Π˜Π›Π˜Β» β€” «|»

Если ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΎΠ±Π° ΠΈΠ· ΠΏΠ°Ρ€Ρ‹ Π±ΠΈΡ‚ΠΎΠ² Ρ€Π°Π²Π΅Π½ Β«1Β» Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Β«1Β», ΠΈΠ½Π°Ρ‡Π΅ Ссли ΠΎΠ±Π° Π±ΠΈΡ‚Π° Ρ€Π°Π²Π½Ρ‹ Β«0Β» Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ Β«0Β». Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π³Ρ€ΡƒΠ±ΠΎ говоря, производится слоТСниС всСх Π΅Π΄ΠΈΠ½ΠΈΡ† Π² разрядах. НапримСр Ссли ΠΌΡ‹ складываСм Π΄Π²Π° числа 0xF8F ΠΈ 0x7F, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Рассмотрим Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ практичСского примСнСния:

  • Если Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ установит ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π±ΠΈΡ‚ Π² числС Π½Π° 1 β€” ΠΌΡ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ маску ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ слоТСниС. НапримСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ 15-ΠΉ Π±ΠΈΡ‚ Π² числС 0xFF0 Π½ΡƒΠΆΠ½ΠΎ провСсти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ логичСского слоТСния ΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒΡΡ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ числами ΠΈ ΠΏΠΎΠ½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π·Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ.»

Если Π±ΠΈΡ‚Ρ‹ Π² разрядС ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΈ Π½Π΅ Ρ€Π°Π²Π½Ρ‹ Ρ‚ΠΎΠ³Π΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Β«1Β», ΠΈΠ½Π°Ρ‡Π΅ Β«0Β». НапримСр, Ссли ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ XOR числа 0xF8F ΠΈ 0x7F, Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ Π² разрядах Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… находятся ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ Ρ‚ΠΎ Ρ‚Π°ΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получаСтся Β«1Β» ΠΈ Π² мСстах Π³Π΄Π΅ Π±ΠΈΡ‚Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅, Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ Β«0Β» ΠΈΠ»ΠΈ Β«1Β» β€” получился Β«0Β», Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Рассмотрим Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ практичСского примСнСния:

  • Если Π½Π°ΠΌ понадобилось ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π±ΠΈΡ‚Ρ‹ Π² числС, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ маску с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ XOR. Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм ΠΈΠ½Π²Π΅Ρ€ΡΠΈΡŽ 6 ΠΈ 7 разряда Π² числС 0xF8 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ маску 0xC0. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ:
  • Π‘Ρ‹Π²Π°ΡŽΡ‚ ситуации ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π° рСгистра ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ ΠΎΠ½ΠΈ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π’ этом случаС Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ значСния рСгистров ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π½ΡƒΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ XOR. Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ получился Β«0Β» β€” Ρ‚ΠΎΠ³Π΄Π° рСгистры Ρ€Π°Π²Π½Ρ‹, ΠΈΠ½Π°Ρ‡Π΅ β€” Π½Π΅ Ρ€Π°Π²Π½Ρ‹:

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сдвига

БущСствуСт ряд интСрСсных ΠΈ ΠΏΠΎΡ€ΠΎΠΉ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΡ‹Ρ… ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сдвига. Π”Π²ΠΈΠ³Π°Ρ‚ΡŒ разряды ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ Π²ΠΏΡ€Π°Π²ΠΎ, Ρ‚Π°ΠΊ ΠΈ Π²Π»Π΅Π²ΠΎ. Π’ Ρ…ΠΎΠ΄Π΅ Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ происходит сдвиг всСх разрядов Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ числа Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ количСство ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ, ΠΏΡ€ΠΈ этом, Π² случаС Ссли сдвиг ΠΈΠ΄Ρ‘Ρ‚ Π²Π»Π΅Π²ΠΎ β€” ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±ΠΈΡ‚ (самый Π»Π΅Π²Ρ‹ΠΉ) тСряСтся, Π° Π² младший (самый ΠΏΡ€Π°Π²Ρ‹ΠΉ) записываСтся Β«0Β». ΠŸΡ€ΠΈ логичСском сдвигС Π²ΠΏΡ€Π°Π²ΠΎ происходит обратная ситуация β€” младший Π±ΠΈΡ‚ (самый ΠΏΡ€Π°Π²Ρ‹ΠΉ) тСряСтся, Π° Π² ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ записываСтся Β«0Β». Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² случаС 32-разрядных слов ΡΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ всС 32 разряда Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. Рассмотрим ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сдвига ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.

CΠ΄Π²ΠΈΠ³ Π²Π»Π΅Π²ΠΎ β€” «<<«

Π’ΠΎ, ΠΊΠ°ΠΊ происходит сдвиг Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½ΠΈΠΆΠ΅. Π”ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ всё достаточно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ:

ΠŸΡ€ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ сдвигС ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ. Π‘Π΄Π²ΠΈΠ³ Π½Π° ΠΎΠ΄ΠΈΠ½ разряд ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ нашС число Π½Π° 2. Если ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ Π½Π° n разрядов нашС число x Ρ‚ΠΎ получится x * (2 * n). ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ эту Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π½Π°ΡˆΡƒ ΡƒΡ‚ΠΈΠ»ΠΊΡƒ для подсчСта. =)

CΠ΄Π²ΠΈΠ³ Π²ΠΏΡ€Π°Π²ΠΎ β€” «>>»

Π’ΠΎ, Ρ‡Ρ‚ΠΎ получаСтся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ сдвига Π²ΠΏΡ€Π°Π²ΠΎ достаточно наглядно ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ:

ΠŸΡ€ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ сдвигС Π²ΠΏΡ€Π°Π²ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ происходит ситуация обратная сдвигу Π²Π»Π΅Π²ΠΎ β€” число дСлится Π½Π° 2 с ΠΏΡ€ΠΈ сдвигС Π² 1 разряд ΠΈ послС Π½Π° 2 * n, Π³Π΄Π΅ n β€” количСство разрядов Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ сдвиг. Π’Π°ΠΊ ΠΆΠ΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒΡΡ с числами ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ дСлятся Π½Π° 2 Π½Π°Ρ†Π΅Π»ΠΎ. И вопрос Π½Π° засыпку β€” ΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ссли Π²Ρ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ число?

Π’Π°ΠΆΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Если Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ сдвиг для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ с ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°ΠΊΠΎΠΌ (signed) β€” освободившиСся ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΅Π΄ΠΈΠ½ΠΈΡ‡ΠΊΠ°ΠΌΠΈ.

Π’ качСствС Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ…

Многим Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌ данная Ρ‚Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π΄ΠΈΠΊΠΎ скучной ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ ΠΎΡ‰ΡƒΡ‰Π΅Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Π½Ρƒ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ понятно Π³Π΄Π΅ ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ эти знания. Π‘ΠΏΠ΅ΡˆΡƒ вас ΠΎΠ±Π½Π°Π΄Π΅ΠΆΠΈΡ‚ΡŒ, Π² ситуациях ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ Ρ‚Ρƒ ΠΈΠ»ΠΈ ΠΈΠ½ΡƒΡŽ Π½ΠΎΠ³Ρƒ МК ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ β€” Ρ‚Π°ΠΌ ΠΊΡ€ΡƒΠ³ΠΎΠΌ ΠΈ Π²ΡΡŽΠ΄Ρƒ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ знания Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ достаточно объСмной, рассмотрСниС рСгистров ΠΌΡ‹ пСрСнСсСм Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΡ€ΠΎΠΊ. Ну ΠΈ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΊΠ°ΠΊ ΡˆΠΏΠ°Ρ€Π³Π°Π»ΠΊΡƒ.

Π’ качСствС домашнСго задания ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π±Π»ΠΎΠΊΠ΅ while(1) {… } ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΆΠ΅ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ опСрациями ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ наши свСтодиоды. Ну Π° Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΡƒΡ€ΠΎΠΊΠ΅ я расскаТу ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ происходит Π½Π° самом Π΄Π΅Π»Π΅!

Бписок статСй:

  1. НачинаСм ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ STM32 ΠΈΠ»ΠΈ УправляСм свСтом ΠΏΠΎ-ΡƒΠΌΠ½ΠΎΠΌΡƒ
  2. НачинаСм ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ STM32: Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
  3. НачинаСм ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ STM32: Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ рСгистры? Как с Π½ΠΈΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ?

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

☰

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

НапримСр, Π² языкС программирования Паскаль ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Π±ΠΈΡ‚Π°ΠΌΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΈΡ… ΠΈ Ρ‚Π΅Ρ… ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов: not, and, or, xor. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ опрСдСляСт, Ρ‡Ρ‚ΠΎ имСлось Π² Π²ΠΈΠ΄Ρƒ Π² зависимости ΠΎΡ‚ контСкста использования этих слов. ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ Π΄Π²Π° ΠΈ Π±ΠΎΠ»Π΅Π΅ простых логичСских выраТСния. НапримСр, (a > 0) and (c != b), (c < a) or(not b) ΠΈ Ρ‚.ΠΏ. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Π΄ Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами (ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡ… содСрТат). НапримСр, a and b, a or 8, not 247.

Как ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

1. ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄Π΅ΠΌ ΠΏΠ°Ρ€Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл Π΄ΠΎ 256 (ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚) Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС.

     6710 = 0100 00112
    11410 =  0111 00102

2. Π’Π΅ΠΏΠ΅Ρ€ΡŒ располоТим Π±ΠΈΡ‚Ρ‹ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ числа ΠΏΠΎΠ΄ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊ Ρ†ΠΈΡ„Ρ€Π°ΠΌ, стоящим Π² ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… разрядах ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ числа. НапримСр, Ссли Π² послСднСм (младшСм) разрядС ΠΎΠ΄Π½ΠΎΠ³ΠΎ числа стоит 1, Π° Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ числа β€” 0, Ρ‚ΠΎ логичСская опСрация and Π²Π΅Ρ€Π½Π΅Ρ‚ 0, Π° or Π²Π΅Ρ€Π½Π΅Ρ‚ 1. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ not ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ числу.

3. ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Π΄Π΅ΡΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ систСму счислСния.

    01000010 = 26 + 21 = 64 + 2 = 66
    01110011 = 26 + 25 + 24 + 21 + 20 = 64 + 32 + 16 + 2 + 1 = 115
    00110001 = 25 + 24 + 20 = 32 + 16 + 1 = 49
    10111100 = 27 + 25 + 24 + 23 + 22 = 128 + 32 + 16 + 8 + 4 = 188
    

4. Π˜Ρ‚Π°ΠΊ, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… логичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

    67 and 114 = 66
    67 or 114 = 115
    67 xor 114 = 49
    not 67 = 188
    

Π’ΠΎΡ‚ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ выполнСния логичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ Π±ΠΈΡ‚Π°ΠΌΠΈ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

    5 and 6 = 4
    5 or 6 = 7
    5 xor 6 = 3
    not 5 = 250
    

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

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

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π±ΠΈΡ‚ΠΎΠ² осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ логичСской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ and.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ имССтся Π±Π°ΠΉΡ‚ памяти с нСизвСстным Π½Π°ΠΌ содСрТимым. Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ логичСская опСрация and Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 1, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Π° ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° содСрТат 1. Если ΠΊ нСизвСстному числу ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ логичСскоС ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ (ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ and) Π½Π° число 255 (Ρ‡Ρ‚ΠΎ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии 1111 1111), Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ нСизвСстноС число. ΠžΠ±Π½ΡƒΠ»ΡΡ‚ΡΡ Ρ‚Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ прСдставлСния числа 255, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½Ρ‹ Π½Π° разряды нСизвСстного числа, содСрТащиС 0. НапримСр, ΠΏΡƒΡΡ‚ΡŒ нСизвСстноС число 38 (0010 0110), Ρ‚ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π±ΠΈΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, x and 255 = x.

ΠžΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ Π±ΠΈΡ‚ΠΎΠ²

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π±ΠΈΡ‚ числа, Π½ΡƒΠΆΠ½ΠΎ Π΅Π³ΠΎ логичСски ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° 0.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

    1111 1110 = 254 = 255 - 1 = 255 - 20
    1111 1101 = 253 = 255 - 2 = 255 - 21
    1111 1011 = 251 = 255 - 4 = 255 - 22
    1111 0111 = 247 = 255 - 8 = 255 - 23
    1110 1111 = 239 = 255 - 16 = 255 - 24
    1101 1111 = 223 = 255 - 32 = 255 - 25
    1011 1111 = 191 = 255 - 64 = 255 - 26
    0111 1111 = 127 = 255 - 128 = 255 - 27

Π’.Π΅. Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ с ΠΊΠΎΠ½Ρ†Π° Π±ΠΈΡ‚ числа x, Π½Π°Π΄ΠΎ Π΅Π³ΠΎ логичСски ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° 247 ΠΈΠ»ΠΈ Π½Π° (255 — 23).

Установка Π±ΠΈΡ‚ΠΎΠ² Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ

Для установки Π±ΠΈΡ‚ΠΎΠ² Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ побитовая логичСская опСрация or. Если ΠΌΡ‹ логичСски слоТим Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС числа x с 0000 0000, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ само число Ρ…. Но Π²ΠΎΡ‚ Ссли ΠΌΡ‹ Π² ΠΊΠ°ΠΊΠΎΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π±ΠΈΡ‚Π΅ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ слагаСмого напишСм Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π² этом Π±ΠΈΡ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†Π°.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ:

    0000 0001 = 20 = 1
    0000 0010 = 21 = 2
    0000 0100 = 22 = 4
    0000 1000 = 23 = 8
    0001 0000 = 24 = 16
    0010 0000 = 25 = 32
    0100 0000 = 26 = 64
    1000 0000 = 27 = 128
    

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎ ΡΡ‚Π°Ρ€ΡˆΠΈΠ½ΡΡ‚Π²Ρƒ Π±ΠΈΡ‚ числа x Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Π½Π°Π΄ΠΎ Π΅Π³ΠΎ логичСски ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ с 64 (x or 64).

Π‘ΠΌΠ΅Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π±ΠΈΡ‚ΠΎΠ²

Для смСны Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π±ΠΈΡ‚ΠΎΠ² Π½Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ битовая опСрация xor. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π±ΠΈΡ‚ числа x, Π² Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΠΎ разряду Π±ΠΈΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ числа Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Если ΠΆΠ΅ трСбуСтся ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Π±ΠΈΡ‚Ρ‹ числа x, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ Π˜Π›Π˜ (xor) с числом 255 (1111 1111).

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ цикличСского сдвига

Помимо ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… логичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… языках программирования прСдусмотрСны Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ цикличСского сдвига Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ. НапримСр, Π² языкС программирования Паскаль эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ shl(сдвиг Π²Π»Π΅Π²ΠΎ) ΠΈ shr (сдвиг Π²ΠΏΡ€Π°Π²ΠΎ).

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сдвига слуТит Ρ†Π΅Π»ΠΎΠ΅ число, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ выполняСтся опСрация. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π΅ указываСтся, Π½Π° сколько ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ ΡΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ Π±ΠΈΡ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ числа Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ. НапримСр, 105 shl 3 ΠΈΠ»ΠΈ 105 shr 4. Число 105 Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ 0110 1001.

ΠŸΡ€ΠΈ сдвигС Π²Π»Π΅Π²ΠΎ Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ исходного числа, Π½Π° ΠΈΡ… мСсто становятся младшиС. ОсвободившиСся младшиС разряды Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ нулями.

ΠŸΡ€ΠΈ сдвигС Π²ΠΏΡ€Π°Π²ΠΎ Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ младшиС Π±ΠΈΡ‚Ρ‹ исходного числа, Π½Π° ΠΈΡ… мСсто становятся ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅. ОсвободившиСся ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ разряды Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ нулями, Ссли исходноС число Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. $yΠ—Π°Π΄Π°ΡŽΡ‚ΡΡ Π±ΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ установлСны Π² $x ΠΈΠ»ΠΈ Π² $y, Π½ΠΎ Π½Π΅ Π² ΠΎΠ±ΠΎΠΈΡ… сразу.~Not~$xΠ‘ΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ установлСны Π² $x, Π½Π΅ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ. И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.<<Shift left$x << $yΠ‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π±ΠΈΡ‚ΠΎΠ² $x Π½Π° $y шагов Π²Π»Π΅Π²ΠΎ.#>>Shift right$x >> $yΠ‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π±ΠΈΡ‚ΠΎΠ² $x Π½Π° $y шагов Π²ΠΏΡ€Π°Π²ΠΎ.*

# ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ шаг ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Π΄Π²Π°Β».
* ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ шаг ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° Π΄Π²Π°Β».

Π’ PHP Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… опСрациях Π±ΠΈΡ‚ (Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ разряд) β€” это базовая Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, хранящаяся Π² Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ систСмС, которая сущСствуСт Π² Π΄Π²ΡƒΡ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… состояниях, прСдставлСнных ΠΊΠ°ΠΊ ON ΠΈΠ»ΠΈ OFF. Π’ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ систСмС состояниС ON рассматриваСтся ΠΊΠ°ΠΊ состояниС 1, Π° OFF β€” 0. Π­Ρ‚ΠΈ состояния ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с двумя состояниями элСктричСского ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Ρ (Π’ΠšΠ› ΠΈ Π’Π«ΠšΠ›) ΠΈ Ρ‚.ΠΏ.

ЗначСния Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ систСмС исчислСния. Π’ дСсятичной систСмС построСниС числа основано Π½Π° 10. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ дСсятичноС число β€”

231 = (2 ; 102 ) + (3 ; 101) + (1 ; 100)
= 200 + 30 + 1
= 231

БистСма Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… чисСл слСдуСт Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ. ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Π°Π·Π° Ρ€Π°Π²Π½Π° 2, Π° Π½Π΅ 10. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ число ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² дСсятичноС β€”

1011010=(1 x 26)+(0 x 25)+(1 x 24)+(1 x 23)+(0 x 22)+(1 x 21)+(0 x 20)
=(1 x 64) +(0 x 32)+(1 x 16)+(1 x 8)+(0 x 4)+(1 x 2)+(0 x 1)
=64+0+16+8+0+2+0
=90

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, (1011010)2= (90)10

Π‘Π°ΠΉΡ‚ состоит ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±ΠΈΡ‚ΠΎΠ². Π‘Π°ΠΉΡ‚ состоит ΠΈΠ· восьми Π±ΠΈΡ‚ΠΎΠ². МаксимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚Π° составляСт 255. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ устанавливаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ мСста ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°.

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
8-ΠΎΠΉ7-ΠΎΠΉ6-ΠΎΠΉ5-Ρ‹ΠΉ4-Ρ‹ΠΉ3-ΠΈΠΉ2-ΠΎΠΉ1-Ρ‹ΠΉ
УстановлСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅1286432168421

Π’Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС Π±Π°ΠΉΡ‚Π°, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅, ΠΊΠ°ΠΊ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚Π° Π² Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с числами составляСт 255:

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
УстановлСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅1286432168421
11111111
2726252423222120
1286432168421=255

ДСсятичноС число 93 ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСно Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅:

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
УстановлСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅1286432168421
01011101
2726252423222120
0640168401=93
<?php  
$x=13;  
$y=22;  
echo $x & $y;  
?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

4

ПояснСниС

ΠžΠΏΠΈΡ€Π°ΡΡΡŒ Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ СдинствСнный ΠΎΠ±Ρ‰ΠΈΠΉ Π±ΠΈΡ‚ находится Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ с установлСнным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 4. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, $x & $y = 4:

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
УстановлСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅1286432168421
$x00001101=13
$y00010110=22

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ для $x (13) установлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ, Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. ЗначСния ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Ρ€Π°Π²Π½Ρ‹ 1, 4 ΠΈ 8. А для $y (22) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ установлСно Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΈ пятой позициях с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ значСниями: 2, 4 ΠΈ 16.

ЕдинствСнный Π±ΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΎΠ±Ρ‰ΠΈΠΌ для $x ΠΈ $y β€” это Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ возвращаСтся 4.

Рассмотрим Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° &, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ большС Π±ΠΈΡ‚.

<?php  
$x=77;  
$y=198;  
echo $x & $y;  
?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° PHP Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

68

ПояснСниС

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
Place Value1286432168421
$x01001101=77
$y11000110=198

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ установлСно для $x (77) Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ, Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ, Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ ΠΈ сСдьмой ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. ЗначСния ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Ρ€Π°Π²Π½Ρ‹ 1, 4, 8 ΠΈ 64. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для $y (198) установлСно Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ, сСдьмой ΠΈ восьмой позициях с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ значСниями: 2, 4, 64 ΠΈ 128.

Из ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠ΅ для $x ΠΈ $y β€” это Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΈ сСдьмой Π±ΠΈΡ‚Ρ‹. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, возвращаСтся 64 + 4 = 68.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° PHP OR:

<?php  
$x=5;  
$y=11;  
echo $x | $y;  
?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

15

ПояснСниС

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
Place Value1286432168421
$x00000101=5
$y00001011=11

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с числами для $x (5) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ установлСно Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ позициях. ЗначСния ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ соотвСтствСнно Ρ€Π°Π²Π½Ρ‹ 1 ΠΈ 4. Для $y (11) значСния установлСны Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ позициях с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ: 1, 2 ΠΈ 8.

Для $x ΠΈ $y ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Π±ΠΈΡ‚. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдставляСт собой Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π±ΠΈΡ‚ΠΎΠ², Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ: 8 + 4 + 2 + 1 = 15.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Xor Ρ‚Π°ΠΊΠΆΠ΅ выполняСт ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ сравнСниС Π΄Π²ΡƒΡ… числовых Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ устанавливаСт ΠΎΠ±Ρ‰ΠΈΠΉ Π±ΠΈΡ‚. Когда ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ являСтся истинным, Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ выполняСтся опСрация XOR:

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 1Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 2Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
FalseFalseFalse
FalseTrueTrue
TrueFalseTrue
TrueTrueFalse

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ сравнСниС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° XOR:

Π‘ΠΈΡ‚ Π² Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ 1Π‘ΠΈΡ‚ Π² Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ 2Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
000
011
101
1
<?php  
$x=12;  
$y=11;  
echo $x ^ $y;  
?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° PHP Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

7

ПояснСниС

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ1286432168421
$x00001100=12
$y00001011=11

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ для $x (12) установлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. ЗначСния ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Ρ€Π°Π²Π½Ρ‹ 4 ΠΈ 8. А для $y (11) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½ΠΎ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ значСниями: 1, 2 ΠΈ 8.

$ x ΠΈ $ y ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ вмСстС ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Π±ΠΈΡ‚. Но вмСстС ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 4-ΠΉ Π±ΠΈΡ‚. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдставляСт собой Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ мСста для Π½ΠΈΡ…. Но Π½Π΅ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π±ΠΈΡ‚: 4 + 2 + 1 = 7.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ NOT выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с $x ΠΈ $y ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π² ΠΎΠ΄Π½ΠΎΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π±ΠΈΡ‚ Π½Π΅ Π·Π°Π΄Π°Π½ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

<?php  
$x=12;  
$y=10;  
echo $x & ~ $y;  
?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

4

ПояснСниС

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ1286432168421
$x00001100=12
$y00001010=10

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ для $x (12) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ установлСно Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ позициях. ЗначСния ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Ρ€Π°Π²Π½Ρ‹ 4 ΠΈ 8. Для $y (10) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ установлСно Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ позициях с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ значСниями 2 ΠΈ 8.

Для $x ΠΈ $y Π·Π°Π΄Π°Π½Ρ‹ Π±ΠΈΡ‚Ρ‹ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ, Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ позициям, Π½ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ для Π½ΠΈΡ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ Π±ΠΈΡ‚. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 4, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это СдинствСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ для $x, Π½ΠΎ Π½Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ для $y.

<?php  
$x=12;  
$y=10;  
echo ~ $x &  $y;  
?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

2

ПояснСниС

Π’ этом случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 2, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π±ΠΈΡ‚ установлСн для $y, Π½ΠΎ Π½Π΅ установлСн для $x.

Если a ΠΈ b β€” это Π΄Π²Π° числа. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сдвига ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π±ΠΈΡ‚ b Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ количСство ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ шаг ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π΄Π²Π° (сдвиг Π²Π»Π΅Π²ΠΎ). Если это сдвиг Π²ΠΏΡ€Π°Π²ΠΎ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π²Π°.

<?php  
$x=8;  
$y=3;  
echo $x << $y;  
?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

64

ПояснСниС

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ1286432168421
$x00001000=8
Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚01000000=64

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ бСрСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $x, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π°Π²Π½ΠΎ 8, ΠΈ выполняСтся опСрация сдвига Π²Π»Π΅Π²ΠΎ: 8 умноТаСтся Π½Π° 2 Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ 8 x 2 x 2 x 2 = 64.

<?php  
$x=12;  
$y=4;  
echo  $x << $y;  
?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

192

ПояснСниС

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ бСрСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $x, Ρ€Π°Π²Π½ΠΎΠ΅ 12, ΠΈ выполняСтся опСрация сдвига Π²Π»Π΅Π²ΠΎ: умноТаСтся Π½Π° 2 Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ 12 x 2 x 2 x 2 x 2 = 192.

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ1286432168421
$x00001100=12
Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚11000000=192
<?php  
$x=8;  
$y=3;  
echo $x >> $y;  
?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с числами:

1

ПояснСниС

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ1286432168421
$x00001000=8
Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚00000001=1

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ бСрСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $x, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π°Π²Π½ΠΎ 8, ΠΈ выполняСтся опСрация сдвига Π²ΠΏΡ€Π°Π²ΠΎ: 8 дСлится Π½Π° 2 Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ 8/2 = 4/2 = 2/2 = 1.

<?php  
$x=96;  
$y=5;  
echo  $x >> $y;  
?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

3

ПояснСниС

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ1286432168421
$x01100000=96
Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚00000011=3

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ бСрСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $x, Ρ€Π°Π²Π½ΠΎΠ΅ 96, ΠΈ выполняСтся опСрация сдвига Π²ΠΏΡ€Π°Π²ΠΎ: 96 дСлится Π½Π° 2 ΠΏΡΡ‚ΡŒ Ρ€Π°Π·. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ 96/2 = 48/2 = 24/2 = 12/2 = 6/2 = 3.

<?php  
$x=64;  
$y=7;  
echo  $x >> $y;   
?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° PHP Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

0

ПояснСниС

1 Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚)
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ1286432168421
$x01000000=64
Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚00000000=0

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ бСрСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ $x, Ρ€Π°Π²Π½ΠΎΠ΅ 64, ΠΈ выполняСтся опСрация сдвига Π²ΠΏΡ€Π°Π²ΠΎ: 64 дСлится Π½Π° 2 сСмь Ρ€Π°Π·. ΠŸΡ€ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π°ΠΌ Π½Π΅Ρ‡Π΅Π³ΠΎ Π΄Π΅Π»ΠΈΡ‚ΡŒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π²Π΅Π½ 0.

Данная публикация являСтся ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ ΡΡ‚Π°Ρ‚ΡŒΠΈ Β«PHP Bitwise operatorΒ» , подготовлСнная Ρ€Π΅Π΄Π°ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Swift: ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π±ΠΈΡ‚Π°ΠΌΠΈ | ΠšΠ°ΠΌΠΎΡ€ΠΊΠ° сурового программиста

– ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ NOT (логичСскоС НЕ, ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ всС Π±ΠΈΡ‚Ρ‹, ~)

00001111
~
11110000

let initialBits: UInt8 = 0b00001111
let invertedBits = ~initialBits // 11110000



00001111

~

11110000

Β 

let initialBits: UInt8 = 0b00001111

let invertedBits = ~initialBitsΒ Β // 11110000

UInt8 – Ρ†Π΅Π»Ρ‹Π΅ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅ числа Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ 255

– ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ AND (логичСскоС И, выдаст 1, Ссли ΠΎΠ±Π° Π±ΠΈΡ‚Π° = 1, &)

11111100
&
00111100
———
00111100


let firstSixBits: UInt8 = 0b11111100
let lastSixBits: UInt8 = 0b00111111
let middleFourBits = firstSixBits & lastSixBits // 00111100



11111100

&

00111100

———

00111100

Β 

Β 

let firstSixBits: UInt8 = 0b11111100

let lastSixBits: UInt8Β Β = 0b00111111

let middleFourBits = firstSixBits & lastSixBitsΒ Β // 00111100

– ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ OR (логичСскоС Π˜Π›Π˜, выдаст 1 Ссли Ρ…ΠΎΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚ = 1, ||)

10110010
||
11111110
———
11111110

let someBits: UInt8 = 0b10110010
let moreBits: UInt8 = 0b01011110
let combinedbits = someBits | moreBits // 11111110



10110010

||

11111110

———

11111110

Β 

let someBits: UInt8 = 0b10110010

let moreBits: UInt8 = 0b01011110

let combinedbits = someBits | moreBitsΒ Β // 11111110

– ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ XOR (логичСсколС Π˜Π›Π˜-НЕ, выдаст 1 Ссли Π±ΠΈΡ‚Ρ‹ Ρ€Π°Π·Π½Ρ‹Π΅, 0 ΠΈ 1, ΠΈΠ½Π°Ρ‡Π΅ 0, ^)

00010100
^
00010001
———
00000101

let firstBits: UInt8 = 0b00010100
let otherBits: UInt8 = 0b00000101
let outputBits = firstBits ^ otherBits // 00010001



00010100

^

00010001

———

00000101

Β 

let firstBits: UInt8 = 0b00010100

let otherBits: UInt8 = 0b00000101

let outputBits = firstBits ^ otherBitsΒ Β // 00010001

– ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ сдвига Ρ†Π΅Π»Ρ‹Ρ… чисСл Π²Π»Π΅Π²ΠΎ ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ >>
По сути Ρ€Π°Π²Π½ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡŽ Π½Π° Π΄Π²Π° ΠΏΡ€ΠΈ сдвигС Π²Π»Π΅Π²ΠΎ, ΠΈ дСлСнию Π½Π° 2 (с отбрасываниСм Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Ссли число Π±Ρ‹Π»ΠΎ Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ) ΠΏΡ€ΠΈ сдвигС Π²ΠΏΡ€Π°Π²ΠΎ

Для Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… всС довольно просто.

Π‘Π΄Π²ΠΈΠ³ Π²Π»Π΅Π²ΠΎ

11111111 << 1 =
1(11111110)



Β Β 11111111 << 1 =

1(11111110)

Π—Π° скобки я вынСс Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ которая Π³Ρ€ΡƒΠ±ΠΎ говоря ΠΏΡ€ΠΎΠΏΠ°Π΄Π°Π΅Ρ‚. Π§Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»Π° понятна ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π° сдвига – Π±Π΅Ρ€Π΅ΠΌ ноль справа (считаСм Ρ‡Ρ‚ΠΎ ΠΈ слСва ΠΈ справа ΠΎΡ‚ числа ΠΈΠ΄Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π±ΠΈΡ‚) дописываСм Π΅Π³ΠΎ справа ΠΈ отбрасываСм послСдний Π±ΠΈΡ‚ слСва. Π Π°Π²Π½ΠΎΡ†Π΅Π½Π½ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡŽ Π½Π° 2.

Π‘Π΄Π²ΠΈΠ³ Π²ΠΏΡ€Π°Π²ΠΎ

11111111 >> 1 =
(01111111)1



11111111 >> 1 =

(01111111)1

ΠŸΡ€ΠΈ сдвигС Π²ΠΏΡ€Π°Π²ΠΎ ноль добавляСтся ΡƒΠΆΠ΅ слСва ΠΈ отбрасываСм послСдний ΠΏΡ€Π°Π²Ρ‹ΠΉ Π±ΠΈΡ‚. Как я ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π» Ρ€Π°Π²Π½ΠΎΡ†Π΅Π½Π½ΠΎ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π° Π΄Π²Π° Π½Π°Ρ†Π΅Π»ΠΎ.

let shiftBits: UInt8 = 4 // 00000100
shiftBits << 1 // 00001000
shiftBits << 2 // 00010000
shiftBits << 5 // 10000000
shiftBits << 6 // 00000000
shiftBits >> 2 // 00000001



let shiftBits: UInt8 = 4Β Β  // 00000100

shiftBits << 1Β Β Β Β Β Β Β Β Β Β Β Β  // 00001000

shiftBits << 2Β Β Β Β Β Β Β Β Β Β Β Β  // 00010000

shiftBits << 5Β Β Β Β Β Β Β Β Β Β Β Β  // 10000000

shiftBits << 6Β Β Β Β Β Β Β Β Β Β Β Β  // 00000000

shiftBits >> 2Β Β Β Β Β Β Β Β Β Β Β Β  // 00000001

Π‘Π΄Π²ΠΈΠ³ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ составного значСния. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Ρ†Π²Π΅Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ 3Ρ…-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½ΠΎΠ΅ число (прСсловутоС RGB), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ· Ρ‚Π°ΠΊΠΎΠ³ΠΎ числа ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ части красного, Π·Π΅Π»Π΅Π½ΠΎΠ³ΠΎ ΠΈ синСго Ρ†Π²Π΅Ρ‚ΠΎΠ² соотвСтствСнно пригодится систСма сдвигов.

let pink: UInt32 = 0xCC6699
let redComponent = (pink & 0xFF0000) >> 16 // redComponent 0xCC, ΠΈΠ»ΠΈ 204
let greenComponent = (pink & 0x00FF00) >> 8 // greenComponent 0x66, ΠΈΠ»ΠΈ 102
let blueComponent = pink & 0x0000FF // blueComponent 0x99, ΠΈΠ»ΠΈ 153



let pink: UInt32 = 0xCC6699

let redComponent = (pink & 0xFF0000) >> 16Β Β Β Β // redComponent 0xCC, ΠΈΠ»ΠΈ 204

let greenComponent = (pink & 0x00FF00) >> 8Β Β  // greenComponent 0x66, ΠΈΠ»ΠΈ 102

let blueComponent = pink & 0x0000FFΒ Β Β Β Β Β Β Β Β Β  // blueComponent 0x99, ΠΈΠ»ΠΈ 153

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ let greenComponent = (pink & 0x00FF00) >> 8
Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ выполняСм ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ слоТСниС Π½Π°Π΄ числом ΠΈ маской 0x00FF00, выдСляСм Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π΅Π»Π΅Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚, Π½ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ число ΠΎΡ‚ 0 Π΄ΠΎ 255 (0x00 – 0xFF), Π° ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ (0x0000 – 0xFF00).n = 128 = 10000000

Π˜Ρ‚ΠΎΠ³ΠΎ

10000000
-
00000100
——-
01111100
И выставляя Π±ΠΈΡ‚ со Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ слСва ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ
11111100



10000000

00000100

——-

01111100

И выставляя Π±ΠΈΡ‚ со Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ слСва ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ

11111100

Π”Π°Π½Π½ΠΎΠ΅ прСдставлСниС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ арифмСтичСскиС дСйствия Π½Π°Π΄ Ρ‚Π°ΠΊΠΈΠΌΠΈ числами производятся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅ΠΌ слоТСниС -1 ΠΈ -4

11111100 (-4)
+
11111111 (-1)
————
111111011 (-5)



11111100 (-4)

+

11111111 (-1)

————

111111011 (-5)

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ сдвиги для Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… числС благодаря Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ Π½Π΅ слоТнСС Ρ‡Π΅ΠΌ для Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ…, Π½ΡƒΠΆΠ½ΠΎ лишь ΠΏΡ€ΠΈ сдвигС Π²ΠΏΡ€Π°Π²ΠΎ Π² качСствС Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ Π±ΠΈΡ‚Π° Π±Ρ€Π°Ρ‚ΡŒ Π½Π΅ всСгда 0, Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Π±ΠΈΡ‚

11111111 >> 1 =
11111111

01111111 >> 1 =
00111111



11111111 >> 1 =

11111111

Β 

01111111 >> 1 =

00111111

Π Π°Π±ΠΎΡ‚Π° с Π±ΠΈΡ‚Π°ΠΌΠΈ Π² JavaScript. ИсслСдованиС ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ и… | by Dan Romans

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ:

Для Π΄Π°Π½Π½ΠΎΠ³ΠΎ n , 32-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа Π±Π΅Π· Π·Π½Π°ΠΊΠ°, ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π±ΠΈΡ‚Ρ‹ Π΅Π³ΠΎ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ прСдставлСния ( 0 -> 1 | 1 -> 0 ) ΠΈ распСчатайтС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число Π±Π΅Π· Π·Π½Π°ΠΊΠ°. . НапримСр:

 n = 12345600000000000000011110001001000000  β‚‚  = 123456  ₁₀  
111111111111100001110110111111 β‚‚ = 4294843839 ₁₀ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = 4294843839

Π² дСсятичном Π²ΠΈΠ΄Π΅ ) ΠΈΠ»ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ (Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ β‚‚ ).Π”Π΅ΡΡΡ‚ΡŒ Ρ†ΠΈΡ„Ρ€, ΠΊΠ°ΠΊ Π² дСсятичной систСмС, ΠΈΠ»ΠΈ Π΄Π²Π΅, ΠΊΠ°ΠΊ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ систСмС: 0 ΠΈ 1 .

* Π¦Π΅Π»ΠΎΠ΅ число Π±Π΅Π· Π·Π½Π°ΠΊΠ° — это 32-битная систСма Π΄Π°Π½Π½Ρ‹Ρ…, которая ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ 4294967295 . Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ просто ΡƒΡ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с 32-Π±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями, Π° Π½Π΅ с ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями.

ОписаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Ѐункция flippingBits () Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ дСсятичноС Ρ†Π΅Π»ΠΎΠ΅ число Π±Π΅Π· Π·Π½Π°ΠΊΠ°.

Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€:

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ:

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:

Π›ΠΎΠ³ΠΈΠΊΠ° довольно проста: ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ дСсятичноС Ρ†Π΅Π»ΠΎΠ΅ число Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅, ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½ΡƒΠ»ΠΈ ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Π²Π΅Ρ€ΡΠΈΡŽ Π² дСсятичноС Ρ†Π΅Π»ΠΎΠ΅. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, Π° Π·Π°Ρ‚Π΅ΠΌ объясним ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс.

  function flippingBits (n) {
// объявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΈ дСсятичного Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°
let lowBin = ''
let highBin = ''
let result = 0
// ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π° дСсятичноС Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅
while (n> = 1) {
const rem = n% 2
lowBin + = rem
rem === 1?
n = ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ°.floor (n / 2):
n / = 2
}
// Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° 32 Π±ΠΈΡ‚Π°
while (lowBin.length <32) {
lowBin + = 0
}
// ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Π±ΠΈΡ‚
для (let i = lowBin.length - 1; i> = 0; i--) {
highBin + = lowBin [i] === '0'? '1': '0'
}
// ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Π² дСсятичный Π²Ρ‹Π²ΠΎΠ΄
for (let i = 0; i const expo = highBin.length - 1 - i
result + = highBin [i] * (2 ** expo)
}
return result
}
  1. ОбъявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… для Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΈ дСсятичного Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°:
  let lowBin = '' 
let highBin = ''
let result = 0

Π”Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число прСдставлСно слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ, ΠΊΠ°ΠΊ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ Π±ΠΈΡ‚ Π΄ΠΎ младшСго Π±ΠΈΡ‚.ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ lowBin Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌ состоянии, ΠΎΡ‚ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ ΠΊ высокому, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ алгСбраичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π²Π²ΠΎΠ΄. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ highBin Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° обратная копия lowBin , поэтому Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ структура высокого порядка – младшСго разряда Π±ΠΈΡ‚. lowBin ΠΈ highBin ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ string , с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ result Π±ΡƒΠ΄Π΅Ρ‚ присвоСно дСсятичноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ значСния, содСрТащСгося Π² highBin , ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ относится ΠΊ Ρ‚ΠΈΠΏΡƒ number, созданному ΠΏΠΎ адрСсу 0 , ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ Π°Π΄Π΄ΠΈΡ‚ΠΈΠ²Π½ΠΎ.

2. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ΅ дСсятичноС число Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅:

Π‘Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ обсудим, ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ алгСбраичСски. ДСсятичноС Ρ†Π΅Π»ΠΎΠ΅ число ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅, Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ² Ρ†Π΅Π»ΠΎΠ΅ число Π½Π° 2 (ΠΊΠ°ΠΊ Π² Π±Π°Π·Π΅ β‚‚ , ΠΊΠ°ΠΊ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ), ΠΏΠΎΠΊΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ достигнСт 0 , сохраняя Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ остатки Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠ°ΠΊ Π±ΠΈΡ‚Ρ‹.ΠŸΡ€ΠΈ Ρ€Π°Π²Π½ΠΎΠΌ Π΄Π΅Π»Π΅Π½ΠΈΠΈ любого числа Π½Π° 2 остаток Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ 0 ΠΈΠ»ΠΈ 1 . Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

 Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ 21 Π½Π° 2, ΠΏΠΎΠΊΠ° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ станСт Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ. ΠžΡΡ‚Π°Ρ‚ΠΊΠΈ этих Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π±ΡƒΠ΄ΡƒΡ‚ Π±ΠΈΡ‚Π°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ для создания Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°: 21/2 = 10 (+) rem 1  Π±ΠΈΡ‚ младшСго разряда  
10/2 = 5 (+) rem 0
5/2 = 2 (+) rem 1
2/2 = 1 (+) rem 0
1/2 = 0 (+) rem 1 h Π±ΠΈΡ‚ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ разряда ΠžΡ€Π³Π°Π½ΠΈΠ·ΡƒΠΉΡ‚Π΅ остаток Π±ΠΈΡ‚ΠΎΠ² Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число: 10101

1/2 = 0 (+) rem 1 Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ сбиваСт с Ρ‚ΠΎΠ»ΠΊΡƒ, Π½ΠΎ ΡƒΡ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами, ΠΈ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡΡ Π΄ΠΎ 1 , ΠΎΠ½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΎ ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число, ΠΎΡΡ‚Π°Π²Π°ΡΡΡŒ большС 0 , поэтому само Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ — 1 — становится остатком.

  // выполняСм послСднюю ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 пСрСдаСтся Π²   
while (n> = 1) {
// ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ остатка (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ) ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚
// остаток ΠΎΡ‚ n / 2 ΠΈ присваиваСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π±ΠΈΡ‚, rem

const rem = n% 2
// rem добавляСтся ΠΊ строкС lowBin
// ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ сохранСния Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
// ΠΊΠ°ΠΊ строки, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ слоТнСС числСнно
// rem, число, приводится ΠΊ строкС ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ объСдинСно
lowBin + = rem // условный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ значСния n
// для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ итСрация
// Ссли rem Ρ€Π°Π²Π½ΠΎ 1, n - Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, поэтому n присваиваСтся
// Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n / 2, ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½ΠΎΠ΅ Π² ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ сторону с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Math.floor ()
// Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС rem Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ 0, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ число,
// ΠΈ n присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n / 2
// это всСгда Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Ρ†ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Ρ†Π΅Π»ΠΎΠ΅ число
rem === 1?
n = Math.floor (n / 2):
n / = 2
}

3. Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° 32 Π±ΠΈΡ‚Π°:

  while (lowBin.length <32) {
lowBin + = 0
}

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Ρ†ΠΈΠΊΠ» while, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Π΄Π²ΠΎΠΈΡ‡Π½ΡƒΡŽ строку, создаСт Ρ€ΠΎΠ²Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π±ΠΈΡ‚ΠΎΠ², сколько Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для прСобразования дСсятичного Π²Π²ΠΎΠ΄Π°.ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ процСссам трСбуСтся 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, поэтому ΠΌΡ‹ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ†ΠΈΠΊΠ» while, установлСнный с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ 32 , для добавлСния Π½ΡƒΠ»Π΅ΠΉ ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ строкС. lowBin + = 0 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ 0 прСобразуСтся Π² строку , Π½ΠΎ Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Ρ‹Ρ‚ΡŒ прямым ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ lowBin + = Β«0Β» .

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈΠ·-Π·Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ порядка Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ†ΠΈΠΊΠ»Π° ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° двоичная строка Π² этой Ρ‚ΠΎΡ‡ΠΊΠ΅ находится Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС - ΠΎΡ‚ младшСго порядка Π΄ΠΎ высокого порядка - поэтому Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΎ нулями ΠΈΠ· справа, добавляя ΠΈΡ… вмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ заполнСния Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ значСния нулями слСва, добавляя ΠΈΡ….

4. Π˜Π½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΠΈΡ‚ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°:

  для (let i = lowBin.length - 1; i> = 0; i--) {
highBin + = lowBin [i] === ' 0 '? '1': '0'
}

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡƒΠ±Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ для Ρ†ΠΈΠΊΠ»Π° , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½ΡƒΡŽ строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽΡΡ Π² lowBin - ΠΊΠΎΠ½Π΅Ρ† Π² Π½Π°Ρ‡Π°Π»ΠΎ - i = 31 -> i = 0 . На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊ highBin добавляСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ( lowBin [i] ), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ опрСдСляСтся условным ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ: Ссли 0 , Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ 1 ; Ссли 1 , Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ 0 .Π­Ρ‚ΠΎΡ‚ процСсс эффСктивно ΠΏΠ΅Ρ€Π΅Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Π΄Π²ΠΎΠΈΡ‡Π½ΡƒΡŽ строку ΠΏΡ€ΠΈ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°.

5. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π² дСсятичный:

И снова Π΄Π°Π²Π°ΠΉΡ‚Π΅ обсудим, ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ алгСбраичСски. Π”Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² дСсятичноС Ρ†Π΅Π»ΠΎΠ΅, ΡƒΠΌΠ½ΠΎΠΆΠΈΠ² ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ†ΠΈΡ„Ρ€Ρƒ Π½Π° ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ 2 ΠΈ суммируя Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, , Ρ‚.Π΅. ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΠΈΡ‚, 0 ΠΈΠ»ΠΈ 1 , ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° 2 , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π°Ρ‚Π΅ΠΌ суммировали ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ n . 2 ΠΊΠΎΡ€Ρ€Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ с основаниСм , Π° n ΠΊΠΎΡ€Ρ€Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ с ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π±ΠΈΡ‚Π°, ΠΊΠ°ΠΊ индСкс. НапримСр:

 ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ 1001β‚‚ Π² дСсятичноС Ρ†Π΅Π»ΠΎΠ΅ число. 
__________________________________
| Π±ΠΈΡ‚ | 1 | 0 | 0 | 1 |
| β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€” | β€”β€”β€”β€” | β€”β€”β€”β€” | β€”β€”β€”β€” | β€”β€”β€”β€” |
| ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ 2 | 2Β³ | 2Β² | 2ΒΉ | 2⁰ |
β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ стСпСни 2 ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ индСкс, Π° - ΠΏΠΎ ΡƒΠ±Ρ‹Π²Π°Π½ΠΈΡŽ. , ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ
Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл упорядочСны ΠΎΡ‚ высокого ΠΊ Π½ΠΈΠ·ΠΊΠΎΠΌΡƒ порядку.1001β‚‚ = (1 * 2Β³) + (0 * 2Β²) + (0 * 2ΒΉ) + (1 * 2⁰) = 9₁₀ Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π»Π΅Π΅ Ρ€Π°Π·Ρ€Π΅Π·Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: 1 * (2 * 2 * 2) = 8
+ 0 * ( 2 * 2) = 0
+ 0 * (2) = 0
+ 1 * (1) = 1 ( n⁰ всСгда Ρ€Π°Π²Π½ΠΎ 1 )
—––––––––––––––– ––––––––
9

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ†ΠΈΠΊΠ» for , ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ доступ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΈ полоТСнию ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° ΠΈΠ»ΠΈ индСксу.

  // вмСсто установки условия ограничСния Π½Π° highBin.length - 1 
// ΠΌΡ‹ устанавливаСм Π½Π° highBin.length (32), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ
// ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ индСкса Π΄ΠΎ 0 для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ expo
// highBin.length - 1 Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ Π½Π° n * 2ΒΉ
// Ссли послСдний вычислСнный Π±ΠΈΡ‚ Π±Ρ‹Π» 0 (0 * 2⁰ = 0), послСднСС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅
// ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ это условиС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ
// послСдний вычислСнный Π±ΠΈΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ 1 (1 * 2⁰ = 1), Ρ‡Ρ‚ΠΎ влияСт Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
// с послСднСС добавлСниС 1
для (let i = 0; i // expo присваиваСтся Π½ΠΎΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°
// Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ это Π±ΡƒΠ΄Π΅Ρ‚: const expo = 32 - 1 - 0 = 31
const expo = highBin.length - 1 - i // Ссли ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±ΠΈΡ‚ Π±Ρ‹Π» 0 (highBin [i] = 0), Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅
// Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ прСобразования Π±Ρ‹Π»ΠΎ Π±Ρ‹: 0 * 2Β³ΒΉ
// Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ добавляСмоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ суммируСтся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ + = highBin [i] * (2 ** expo)
}

6. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

И послСднСС, Π½ΠΎ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²Π°ΠΆΠ½ΠΎΠ΅: Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ .

 const n = 123456 flippingBits (n) // lowBin = 00000010010001111000000000000000 
// ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π±ΠΈΡ‚Ρ‹ ΠΈ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ строку
// highBin = 111111111111100001110110111111 // => 4294843839

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:

term optimized. Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Ρ‚Π΅Ρ€ΠΌΠΈΠ½

.Π― имСю Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ это сТато, Π½ΠΎ я Π½Π΅ тСстировал различия Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ этих Ρ‚Ρ€Π΅Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, поэтому ΠΏΠΎΠΊΠ° Π½Π΅ ΠΌΠΎΠ³Ρƒ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎΠ± истинной ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. Однако моя повСрхностная ΠΎΡ†Π΅Π½ΠΊΠ° Ρ‚Π°ΠΊΠΎΠ²Π°, Ρ‡Ρ‚ΠΎ Π΄Π°, это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, ΠΈ прСдстоящСС свСрхкомпактноС ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ каТСтся довольно быстрым!

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° большой объСм ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ? Π’Π°ΠΊ ΡƒΠΆ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ JavaScript ΠΈ, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ встроСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ наш Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.

  function flippingBits (n) { 
// ΠΌΠ΅Ρ‚ΠΎΠ΄ Number.toString () ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ число
// Π² строку И ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ radix для прСобразования
// числа Π² строку ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π±Π°Π·Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ base β‚‚ для Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°
let lowBin = n.toString (2)
let highBin = ''
// Number.toString () создаСт Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ строковоС прСдставлСниС Π²
// ΠΈΡΠΏΡ€Π°Π²ΡŒΡ‚Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ порядка Π½Π° ΠΌΠ»Π°Π΄ΡˆΡƒΡŽ, поэтому Π½ΡƒΠ»ΠΈ
// Π΄ΠΎΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ слСва, добавляя ΠΈΡ… Π² Π½Π°Ρ‡Π°Π»Π΅

while (lowBin.length <32) {
lowBin = 0 + lowBin
}
// ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ высокого порядка ΠΊ ΠΌΠ»Π°Π΄ΡˆΠ΅ΠΌΡƒ ΡƒΠΆΠ΅ Π²Π΅Ρ€Π½Π°
// этому Ρ†ΠΈΠΊΠ»Ρƒ for Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π±ΠΈΡ‚Ρ‹, Π° Π½Π΅ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ строку

for (let i = 0; i highBin + = lowBin [i] === '0'? '1': '0'
}
// функция parseInt () ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку Π² число
// И ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ систСмы счислСния Π²
// ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ строку Π² Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π±Π°Π·Ρ‹ , Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ base β‚‚
return parseInt (highBin, 2)
}

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² сторону, это Π±ΠΎΠ»Π΅Π΅ короткая ΠΈ Π±ΠΎΠ»Π΅Π΅ чистая функция, Ρ‡Π΅ΠΌ прСдыдущая.Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠΎΡ‰ΡŒ встроСнных ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ мСньшС памяти ΠΈ выполняСт мСньшС ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π² ΠΎΠ΄Π½Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ строку ΠΊΠΎΠ΄Π° ΠΈ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°? Барабанная Π΄Ρ€ΠΎΠ±ΡŒ, поТалуйста.

Бпасибо, Π΄ΠΆΠ°Π·ΠΎΠ²Ρ‹ΠΉ мСссСндТСр!

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:

  const flippingBits = n => ~ n >>> 0  

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π² это ΠΏΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ? Π― ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ Π·Π½Π°Π»! Ѐункция ΠΆΠΈΡ€Π½ΠΎΠΉ стрСлки ES6 Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ (Π±Π΅Π· ΠΊΠ°Π»Π°ΠΌΠ±ΡƒΡ€Π°), Π½ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ / Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ восхищСниС.Ѐункция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, число n , ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСсятичноС цСлочислСнноС прСдставлСниС ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ n . Но ΠΊΠ°ΠΊ?

  1. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ НЕ:

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ НЕ обозначаСтся ΠΊΠ°ΠΊ ~ ΠΈ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС числа ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ. ΠšΠ°ΠΆΠ΄Ρ‹Π΅ 0 ΠΏΠ΅Ρ€Π΅Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² 1 , ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 1 ΠΏΠ΅Ρ€Π΅Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² 0 . 010100 станСт 101011 . Однако Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ нюанс.

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

Наша Π·Π°Π΄Π°Ρ‡Π° ΠΊΠΎΠ΄Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ 32-разрядноС Ρ†Π΅Π»ΠΎΠ΅ число Π±Π΅Π· Π·Π½Π°ΠΊΠ°. Π£ нас Π½ΠΈΡ‡Π΅Π³ΠΎ этого Π½Π΅Ρ‚ послС использования ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Bitwise NOT . НС Π±ΠΎΠΉΡ‚Π΅ΡΡŒ, Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ спасСт ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

2. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сдвига Π²ΠΏΡ€Π°Π²ΠΎ с Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π½ΡƒΠ»Π΅ΠΌ:

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ с Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ нуля Π²ΠΏΡ€Π°Π²ΠΎ обозначаСтся ΠΊΠ°ΠΊ >>> ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ количСство сдвигов. Он сдвигаСт ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±ΠΈΡ‚ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ количСство Π±ΠΈΡ‚ Π²ΠΏΡ€Π°Π²ΠΎ.Π›ΠΈΡˆΠ½ΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π²ΠΏΡ€Π°Π²ΠΎ, Π° Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ ( 0 ) Π±ΠΈΡ‚Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ слСва. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Π±ΠΈΡ‚ становится Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ становится ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

Для этого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ количСство сдвигов составляСт 0 , Ρ‡Ρ‚ΠΎ ΠΏΠΎ сущСству создаСт ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° наша двоичная ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дополняСтся нулями Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π½Π΅ станСт 32-Π±ΠΈΡ‚Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ с Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ нулями Π²ΠΏΡ€Π°Π²ΠΎ сдвиг всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число Π±Π΅Π· Π·Π½Π°ΠΊΠ° . Π‘Π΅Π³ΠΈ Π΄ΠΎΠΌΠΎΠΉ.

ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ руководство ΠΏΠΎ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ Π² Java

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

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг - это побитовая опСрация, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ порядок ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±ΠΈΡ‚ΠΎΠ² пСрСмСщаСтся для эффСктивного выполнСния матСматичСской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.Π‘ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ†ΠΈΡ„Ρ€Ρƒ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии числа Π²Π»Π΅Π²ΠΎ ΠΈΠ»ΠΈ Π²ΠΏΡ€Π°Π²ΠΎ Π½Π° количСство ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ², Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ.

Π­Ρ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ Ρ†Π΅Π»Ρ‹ΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ int , long , short , byte ΠΈΠ»ΠΈ char .

Π•ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π° смСн:

  • Π‘Π΄Π²ΠΈΠ³ Π²Π»Π΅Π²ΠΎ: << - ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сдвига Π²Π»Π΅Π²ΠΎ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ трСбованиям ΠΊΠ°ΠΊ логичСских, Ρ‚Π°ΠΊ ΠΈ арифмСтичСских сдвигов.
  • АрифмСтичСский / Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ сдвиг Π²ΠΏΡ€Π°Π²ΠΎ: >> - это арифмСтичСский (ΠΈΠ»ΠΈ Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ) ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сдвига Π²ΠΏΡ€Π°Π²ΠΎ.
  • ЛогичСский / Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ сдвиг Π²ΠΏΡ€Π°Π²ΠΎ: >>> - логичСский (ΠΈΠ»ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ) ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сдвига Π²ΠΏΡ€Π°Π²ΠΎ.

Π’ Java всС цСлочислСнныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… подписаны, Π° << ΠΈ >> ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ арифмСтичСскиС сдвиги.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сдвига Π²Π»Π΅Π²ΠΎ:

6 = 000000006 = 000000006 = 00000000 000000000000000000000000 000000000000000000000000 000001100000011000000110

Π‘Π΄Π²ΠΈΠ³ этой Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π²Π»Π΅Π²ΠΎ ( 6 << 1 ) ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ числу 12:

6 << 1 = 000000006 << 1 = 000000006 << 1 = 00000000 000000000000000000000000 000000000000000000000000 000011000000110000001100

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ†ΠΈΡ„Ρ€Ρ‹ смСщСны Π²Π»Π΅Π²ΠΎ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π° послСдняя Ρ†ΠΈΡ„Ρ€Π° справа Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π° Π½ΡƒΠ»Π΅ΠΌ.36 * 2 3 β†’ 6 * 86 * 86 * 8

Π₯ΠΎΡ€ΠΎΡˆΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ компиляторы Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для Π·Π°ΠΌΠ΅Π½Ρ‹ умноТСния сдвигами, ΠΊΠΎΠ³Π΄Π° это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сдвиги Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ быстрСС.

Как Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π±ΠΈΡ‚Ρ‹ ΠΈ Π±Π°ΠΉΡ‚Ρ‹

Если Π²Ρ‹ использовали ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π±ΠΎΠ»Π΅Π΅ пяти ΠΌΠΈΠ½ΡƒΡ‚, Ρ‚ΠΎ Π²Ρ‹ ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ слова Π±ΠΈΡ‚ ΠΈ Π±Π°ΠΉΡ‚ . ОбъСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΈ ТСсткого диска измСряСтся Π² Π±Π°ΠΉΡ‚Π°Ρ…, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ просматриваСтС ΠΈΡ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ просмотра Ρ„Π°ΠΉΠ»ΠΎΠ².

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΠ»Ρ‹ΡˆΠ°Ρ‚ΡŒ Ρ€Π΅ΠΊΠ»Π°ΠΌΡƒ, которая гласит: "Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ оснащСн 32-разрядным процСссором Pentium с 64 ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π°ΠΌΠΈ RAM ΠΈ 2.1 Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚ мСста Π½Π° ТСстком дискС ". И ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ HowStuffWorks говорят ΠΎ Π±Π°ΠΉΡ‚Π°Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-диски). Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ обсудим Π±ΠΈΡ‚Ρ‹ ΠΈ Π±Π°ΠΉΡ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΈΠΌΠ΅Π»ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ прСдставлСниС ΠΎ Π½ΠΈΡ….

ДСсятичныС числа

Π‘Π°ΠΌΡ‹ΠΉ простой способ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π±ΠΈΡ‚Ρ‹ - ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΈΡ… с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅: Ρ†ΠΈΡ„Ρ€, . Π¦ΠΈΡ„Ρ€Π° - это Π΅Π΄ΠΈΠ½ΠΎΠ΅ мСсто, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ числовыС значСния ΠΎΡ‚ 0 Π΄ΠΎ 9. 0) = 6000 + 300 + 50 + 7 = 6357

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈΠ· этого выраТСния состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ каТдая Ρ†ΠΈΡ„Ρ€Π° являСтся Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π΅ΠΌ для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π±ΠΎΠ»Π΅Π΅ высокой стСпСни 10, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ†ΠΈΡ„Ρ€Ρ‹ с 10, Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ нуля.

Π­Ρ‚ΠΎ всС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ - ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с дСсятичными числами ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ дСнь. Π‘Π°ΠΌΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π² систСмах счислСния Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎ заставляло Π±Ρ‹ вас ΠΈΠΌΠ΅Ρ‚ΡŒ 10 Ρ€Π°Π·Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Ρ†ΠΈΡ„Ρ€Π΅. Наша систСма счислСния ΠΏΠΎ основанию 10 ΠΈ , вСроятно, выросла ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ нас 10 ΠΏΠ°Π»ΡŒΡ†Π΅Π², Π½ΠΎ Ссли Π±Ρ‹ ΠΌΡ‹ ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π΄ΠΎ восьми ΠΏΠ°Π»ΡŒΡ†Π΅Π², Ρƒ нас, вСроятно, Π±Ρ‹Π»Π° Π±Ρ‹ систСма счислСния с основаниСм 8. Π£ вас ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ систСмы счислСния с Π»ΡŽΠ±Ρ‹ΠΌ основаниСм. На самом Π΄Π΅Π»Π΅, Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ вСских ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π±Π°Π·Ρ‹ Π² Ρ€Π°Π·Π½Ρ‹Ρ… ситуациях.

ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² систСмС счислСния с основаниСм 2, Ρ‚Π°ΠΊΠΆΠ΅ извСстной ΠΊΠ°ΠΊ двоичная систСма счислСния (Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ систСма счислСния с основаниСм 10 извСстна ΠΊΠ°ΠΊ дСсятичная систСма счислСния). Π£Π·Π½Π°ΠΉΡ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈ ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ строки

Π­Ρ‚Π° докумСнтация ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для Π½Π΅ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ вСрсии PostgreSQL.
Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ страницу для
Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ
вСрсия ΠΈΠ»ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… вСрсий, пСрСчислСнных Π²Ρ‹ΡˆΠ΅.

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ описаны Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для исслСдования ΠΈ управлСния Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ строками, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ значСниями Ρ‚ΠΈΠΏΠΎΠ² bit ΠΈ bit, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ. Помимо ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² сравнСния, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² Π’Π°Π±Π»ΠΈΡ†Π΅ 9-11. ΠžΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ строки &, | ΠΈ # Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. ΠŸΡ€ΠΈ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΌ сдвигС исходная Π΄Π»ΠΈΠ½Π° строки сохраняСтся, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ….

Π’Π°Π±Π»ΠΈΡ†Π° 9-11. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ строки

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ОписаниС ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
|| конкатСнация B'10001 '|| B'011 ' 10001011
ΠΈ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ И B'10001 'ΠΈ B'01101' 00001
| ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π˜Π›Π˜ B'10001 '| B'01101 ' 11101
# ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ XOR B'10001 '# B'01101' 11100
~ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ НЕ ~ B'10001 ' 01110
<< ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²Π»Π΅Π²ΠΎ B'10001 '<< 3 01000
>> ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²ΠΏΡ€Π°Π²ΠΎ Π’'10001 '>> 2 00100

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ стандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SQL Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ строками, Π° Ρ‚Π°ΠΊΠΆΠ΅ с ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ строками: Π΄Π»ΠΈΠ½Π° , Π΄Π»ΠΈΠ½Π° Π±ΠΈΡ‚ , Π΄Π»ΠΈΠ½Π°_ΠΎΠΊΡ‚Π΅Ρ‚Π° , позиция , подстрока , ΠΎΠ²Π΅Ρ€Π»Π΅ΠΉ .

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ°ΠΊ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ строками, Ρ‚Π°ΠΊ ΠΈ с Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌΠΈ строками: get_bit , set_bit . ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ строкой эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠΌΠ΅Ρ€ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ (ΠΊΡ€Π°ΠΉΠ½ΠΈΠΉ Π»Π΅Π²Ρ‹ΠΉ) Π±ΠΈΡ‚ строки ΠΊΠ°ΠΊ Π±ΠΈΡ‚ 0.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ†Π΅Π»Ρ‹Π΅ значСния ΠΊ Ρ‚ΠΈΠΏΡƒ bit ΠΈ ΠΎΡ‚ Π½Π΅Π³ΠΎ. НСкоторыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

 44 :: Π±ΠΈΡ‚ (10)  0000101100 
44 :: Π±ΠΈΡ‚ (3)  100 
Π»ΠΈΡ‚ΠΎΠΉ (-44 ΠΊΠ°ΠΊ Π±ΠΈΡ‚ (12))  111111010100 
'1110' :: Π±ΠΈΡ‚ (4) :: Ρ†Π΅Π»ΠΎΠ΅ число  14  

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Β«Π±ΠΈΡ‚Β» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π±ΠΈΡ‚ (1), поэтому Π±ΡƒΠ΄Π΅Ρ‚ доставлСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ младший Π·Π½Π°Ρ‡Π°Ρ‰ΠΈΠΉ Π±ΠΈΡ‚ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа Π² Π±ΠΈΡ‚ (n) ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ самыС ΠΏΡ€Π°Π²Ρ‹Π΅ n Π±ΠΈΡ‚ΠΎΠ². ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа ΠΊ ΡˆΠΈΡ€ΠΈΠ½Π΅ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ строки ΡˆΠΈΡ€Π΅, Ρ‡Π΅ΠΌ само Ρ†Π΅Π»ΠΎΠ΅ число, Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒΡΡ ΠΏΠΎ Π·Π½Π°ΠΊΡƒ слСва.

O.3 - Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ манипуляции с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ масками

Автор Alex 8 сСнтября 2015 Π³. | послСднСС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅: nascardriver 6 дСкабря 2020 Π³.

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΡƒΡ€ΠΎΠΊΠ΅ ΠΎ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… (O.2 - ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹) ΠΌΡ‹ обсудили, ΠΊΠ°ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π±ΠΈΡ‚Ρƒ Π² ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°Ρ….Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‡Π°Ρ‰Π΅.

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΡ…), Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ способ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. К соТалСнию, ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ ΡƒΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ позициями. ВмСсто этого ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ масками.

Битовая маска - это ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π±ΠΈΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π±ΠΎΡ€Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π±ΠΈΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… опСрациях.

Рассмотрим случай ΠΈΠ· Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΊΡ€Π°ΡΠΈΡ‚ΡŒ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ Ρ€Π°ΠΌΡƒ. Если Π½Π΅ ΠΏΡ€ΠΎΡΠ²ΠΈΡ‚ΡŒ ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, рискуСтС ΠΏΠΎΠΊΡ€Π°ΡΠΈΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΊΠΎΠ½Π½ΡƒΡŽ Ρ€Π°ΠΌΡƒ, Π½ΠΎ ΠΈ само стСкло. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΡƒΠΏΠΈΡ‚ΡŒ малярный скотч ΠΈ ΠΏΡ€ΠΈΠΊΠ»Π΅ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊ стСклу ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ частям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΊΡ€Π°ΡΠΈΡ‚ΡŒ. Π—Π°Ρ‚Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ рисуСтС, малярная Π»Π΅Π½Ρ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ краски Π½Π° всС, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСмаскированныС части (Ρ‚Π΅ части, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΊΡ€Π°ΡΠΈΡ‚ΡŒ).

Битовая маска, ΠΏΠΎ сути, выполняСт Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Π±ΠΈΡ‚ΠΎΠ² - битовая маска Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΡ‚ прикосновСния ΠΊ Π±ΠΈΡ‚Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ, ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ доступ ΠΊ Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ сначала рассмотрим, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ нСсколько простых Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… масок, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π²Π°ΠΌ, ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… масок Π² C ++ 14

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ Π½Π°Π±ΠΎΡ€ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… масок - это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ маски для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½ΡƒΠ»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΌΠ°ΡΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹, ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Π±ΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

Π₯отя Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°ΠΌΠΈ, ΠΎΠ½ΠΈ часто ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ константы, поэтому ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Ρ‚ΡŒ осмыслСнноС имя ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ C ++ 14 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ эти Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски ΠΎΡ‡Π΅Π½ΡŒ просто:

#include

constexpr std :: uint_fast8_t mask0 {0b0000'0001}; // прСдставляСт Π±ΠΈΡ‚ 0

constexpr std :: uint_fast8_t mask1 {0b0000'0010}; // прСдставляСт Π±ΠΈΡ‚ 1

constexpr std :: uint_fast8_t mask2 {0b0000'0100}; // прСдставляСт Π±ΠΈΡ‚ 2

constexpr std :: uint_fast8_t mask3 {0b0000'1000}; // прСдставляСт Π±ΠΈΡ‚ 3

constexpr std :: uint_fast8_t mask4 {0b0001'0000}; // прСдставляСт Π±ΠΈΡ‚ 4

constexpr std :: uint_fast8_t mask5 {0b0010'0000}; // прСдставляСт Π±ΠΈΡ‚ 5

constexpr std :: uint_fast8_t mask6 {0b0100'0000}; // прСдставляСт Π±ΠΈΡ‚ 6

constexpr std :: uint_fast8_t mask7 {0b1000'0000}; // прСдставляСт Π±ΠΈΡ‚ 7

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… констант, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для манипулирования Π±ΠΈΡ‚Π°ΠΌΠΈ (Ρ‡Ρ‚ΠΎ ΠΌΡ‹ вскорС ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ).

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… масок Π² C ++ 11 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅ΠΉ вСрсии

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ C ++ 11 Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для установки ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… констант. Для этого Π΅ΡΡ‚ΡŒ Π΄Π²Π° Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. МСнСС понятным, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ распространСнным являСтся использованиС ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ числа. Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΉ систСмС счислСния, Π΅Ρ‰Π΅ Ρ€Π°Π· посСтитС ΡƒΡ€ΠΎΠΊ 4.13 - Π›ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹.

constexpr std :: uint_fast8_t mask0 {0x1}; // ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ 0000 0001

constexpr std :: uint_fast8_t mask1 {0x2}; // ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ 0000 0010

constexpr std :: uint_fast8_t mask2 {0x4}; // ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ 0000 0100

constexpr std :: uint_fast8_t mask3 {0x8}; // ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ 0000 1000

constexpr std :: uint_fast8_t mask4 {0x10}; // ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ 0001 0000

constexpr std :: uint_fast8_t mask5 {0x20}; // ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ 0010 0000

constexpr std :: uint_fast8_t mask6 {0x40}; // ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0100 0000

constexpr std :: uint_fast8_t mask7 {0x80}; // ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ для 1000 0000

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ.Один ΠΈΠ· способов ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сдвига Π²Π»Π΅Π²ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ мСсто:

constexpr std :: uint_fast8_t mask0 {1 << 0}; // 0000 0001

constexpr std :: uint_fast8_t mask1 {1 << 1}; // 0000 0010

constexpr std :: uint_fast8_t mask2 {1 << 2}; // 0000 0100

constexpr std :: uint_fast8_t mask3 {1 << 3}; // 0000 1000

constexpr std :: uint_fast8_t mask4 {1 << 4}; // 0001 0000

constexpr std :: uint_fast8_t mask5 {1 << 5}; // 0010 0000

constexpr std :: uint_fast8_t mask6 {1 << 6}; // 0100 0000

constexpr std :: uint_fast8_t mask7 {1 << 7}; // 1000 0000

НСмного тСстируСм (Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… масок, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… вмСстС с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π»Π°Π³Π° для управлСния нашими Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ Ρ„Π»Π°Π³Π°ΠΌΠΈ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ Π±ΠΈΡ‚, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ И Π² сочСтании с Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ маской для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±ΠΈΡ‚Π°:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

18

19

20

21

#include

#include

int main ()

{

constexpr std :: uint_fast8_t mask0 {0b0000'0001}; // прСдставляСт Π±ΠΈΡ‚ 0

constexpr std :: uint_fast8_t mask1 {0b0000'0010}; // прСдставляСт Π±ΠΈΡ‚ 1

constexpr std :: uint_fast8_t mask2 {0b0000'0100}; // прСдставляСт Π±ΠΈΡ‚ 2

constexpr std :: uint_fast8_t mask3 {0b0000'1000}; // прСдставляСт Π±ΠΈΡ‚ 3

constexpr std :: uint_fast8_t mask4 {0b0001'0000}; // прСдставляСт Π±ΠΈΡ‚ 4

constexpr std :: uint_fast8_t mask5 {0b0010'0000}; // прСдставляСт Π±ΠΈΡ‚ 5

constexpr std :: uint_fast8_t mask6 {0b0100'0000}; // прСдставляСт Π±ΠΈΡ‚ 6

constexpr std :: uint_fast8_t mask7 {0b1000'0000}; // прСдставляСт Π±ΠΈΡ‚ 7

std :: uint_fast8_t flags {0b0000'0101}; // Π Π°Π·ΠΌΠ΅Ρ€ 8 Π±ΠΈΡ‚ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ мСсто для 8 Ρ„Π»Π°Π³ΠΎΠ²

std :: cout << "Π±ΠΈΡ‚ 0 Ρ€Π°Π²Π΅Π½" << ((flags & mask0)? "On \ n": "off \ n");

std :: cout << "Π±ΠΈΡ‚ 1 Ρ€Π°Π²Π΅Π½" << ((flags & mask1)? "On \ n": "off \ n");

Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;

}

Π­Ρ‚ΠΎ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ:

 Π±ΠΈΡ‚ 0 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 1 Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½
 

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

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ (Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ) Π±ΠΈΡ‚, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π˜Π›Π˜ Ρ€Π°Π²Π½ΠΎ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ | =) Π² сочСтании с Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ маской для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±ΠΈΡ‚Π°:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

18

19

20

21

22

23

24

#include

#include

int main ()

{

constexpr std :: uint_fast8_t mask0 {0b0000'0001}; // прСдставляСт Π±ΠΈΡ‚ 0

constexpr std :: uint_fast8_t mask1 {0b0000'0010}; // прСдставляСт Π±ΠΈΡ‚ 1

constexpr std :: uint_fast8_t mask2 {0b0000'0100}; // прСдставляСт Π±ΠΈΡ‚ 2

constexpr std :: uint_fast8_t mask3 {0b0000'1000}; // прСдставляСт Π±ΠΈΡ‚ 3

constexpr std :: uint_fast8_t mask4 {0b0001'0000}; // прСдставляСт Π±ΠΈΡ‚ 4

constexpr std :: uint_fast8_t mask5 {0b0010'0000}; // прСдставляСт Π±ΠΈΡ‚ 5

constexpr std :: uint_fast8_t mask6 {0b0100'0000}; // прСдставляСт Π±ΠΈΡ‚ 6

constexpr std :: uint_fast8_t mask7 {0b1000'0000}; // прСдставляСт Π±ΠΈΡ‚ 7

std :: uint_fast8_t flags {0b0000'0101}; // Π Π°Π·ΠΌΠ΅Ρ€ 8 Π±ΠΈΡ‚ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ мСсто для 8 Ρ„Π»Π°Π³ΠΎΠ²

std :: cout << "Π±ΠΈΡ‚ 1 Ρ€Π°Π²Π΅Π½" << ((flags & mask1)? "On \ n": "off \ n");

Ρ„Π»Π°Π³ΠΎΠ² | = маска1; // Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΡ‚ 1

std :: cout << "Π±ΠΈΡ‚ 1 Ρ€Π°Π²Π΅Π½" << ((flags & mask1)? "on \ n": "off \ n");

Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;

}

Π­Ρ‚ΠΎ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ:

 Π±ΠΈΡ‚ 1 Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 1 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½
 

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ нСсколько Π±ΠΈΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π˜Π›Π˜ :

Ρ„Π»Π°Π³ΠΎΠ² | = (маска4 | маска5); // ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΡ‚Ρ‹ 4 ΠΈ 5

Бброс Π±ΠΈΡ‚Π°

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ (Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ), ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ И ΠΈ ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ НЕ вмСстС:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

18

19

20

21

22

23

24

#include

#include

int main ()

{

constexpr std :: uint_fast8_t mask0 {0b0000'0001}; // прСдставляСт Π±ΠΈΡ‚ 0

constexpr std :: uint_fast8_t mask1 {0b0000'0010}; // прСдставляСт Π±ΠΈΡ‚ 1

constexpr std :: uint_fast8_t mask2 {0b0000'0100}; // прСдставляСт Π±ΠΈΡ‚ 2

constexpr std :: uint_fast8_t mask3 {0b0000'1000}; // прСдставляСт Π±ΠΈΡ‚ 3

constexpr std :: uint_fast8_t mask4 {0b0001'0000}; // прСдставляСт Π±ΠΈΡ‚ 4

constexpr std :: uint_fast8_t mask5 {0b0010'0000}; // прСдставляСт Π±ΠΈΡ‚ 5

constexpr std :: uint_fast8_t mask6 {0b0100'0000}; // прСдставляСт Π±ΠΈΡ‚ 6

constexpr std :: uint_fast8_t mask7 {0b1000'0000}; // прСдставляСт Π±ΠΈΡ‚ 7

std :: uint_fast8_t flags {0b0000'0101}; // Π Π°Π·ΠΌΠ΅Ρ€ 8 Π±ΠΈΡ‚ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ мСсто для 8 Ρ„Π»Π°Π³ΠΎΠ²

std :: cout << "Π±ΠΈΡ‚ 2 Ρ€Π°Π²Π΅Π½" << ((flags & mask2)? "On \ n": "off \ n");

flags & = ~ mask2; // Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ 2

std :: cout << "Π±ΠΈΡ‚ 2 Ρ€Π°Π²Π΅Π½" << ((flags & mask2)? "on \ n": "off \ n");

Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;

}

Π­Ρ‚ΠΎ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ:

 Π±ΠΈΡ‚ 2 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 2 Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½
 

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ нСсколько Π±ΠΈΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ:

Ρ„Π»Π°Π³ΠΎΠ² & = ~ (маска4 | маска5); // ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΡ‚Ρ‹ 4 ΠΈ 5

НСмного пСрСворачивая

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ состояниС, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Bitwise XOR :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

18

19

20

21

22

23

24

#include

#include

int main ()

{

constexpr std :: uint_fast8_t mask0 {0b0000'0001}; // прСдставляСт Π±ΠΈΡ‚ 0

constexpr std :: uint_fast8_t mask1 {0b0000'0010}; // прСдставляСт Π±ΠΈΡ‚ 1

constexpr std :: uint_fast8_t mask2 {0b0000'0100}; // прСдставляСт Π±ΠΈΡ‚ 2

constexpr std :: uint_fast8_t mask3 {0b0000'1000}; // прСдставляСт Π±ΠΈΡ‚ 3

constexpr std :: uint_fast8_t mask4 {0b0001'0000}; // прСдставляСт Π±ΠΈΡ‚ 4

constexpr std :: uint_fast8_t mask5 {0b0010'0000}; // прСдставляСт Π±ΠΈΡ‚ 5

constexpr std :: uint_fast8_t mask6 {0b0100'0000}; // прСдставляСт Π±ΠΈΡ‚ 6

constexpr std :: uint_fast8_t mask7 {0b1000'0000}; // прСдставляСт Π±ΠΈΡ‚ 7

std :: uint_fast8_t flags {0b0000'0101}; // Π Π°Π·ΠΌΠ΅Ρ€ 8 Π±ΠΈΡ‚ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ мСсто для 8 Ρ„Π»Π°Π³ΠΎΠ²

std :: cout << "Π±ΠΈΡ‚ 2 Ρ€Π°Π²Π΅Π½" << ((flags & mask2)? "On \ n": "off \ n");

Ρ„Π»Π°Π³ΠΎΠ² ^ = маска2; // ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π±ΠΈΡ‚ 2

std :: cout << "Π±ΠΈΡ‚ 2 Ρ€Π°Π²Π΅Π½" << ((flags & mask2)? "on \ n": "off \ n");

Ρ„Π»Π°Π³ΠΎΠ² ^ = маска2; // ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π±ΠΈΡ‚ 2

std :: cout << "Π±ΠΈΡ‚ 2 Ρ€Π°Π²Π΅Π½" << ((flags & mask2)? "on \ n": "off \ n");

Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;

}

Π­Ρ‚ΠΎ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ:

 Π±ΠΈΡ‚ 2 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 2 Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 2 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½
 

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ нСсколько Π±ΠΈΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ:

Ρ„Π»Π°Π³ΠΎΠ² ^ = (маска4 | маска5); // ΠΏΠ΅Ρ€Π΅Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π±ΠΈΡ‚Ρ‹ 4 ΠΈ 5 ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски ΠΈ std :: bitset

std :: bitset ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ для измСнСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΡ‚ΠΎΠ² ΠΏΡ€ΠΎΡ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, установка, сброс ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΡ€ΠΎΡ‚), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅.

Π—Π°Ρ‡Π΅ΠΌ Π²Π°ΠΌ это Π½ΡƒΠΆΠ½ΠΎ? Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹. ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ сразу нСсколько Π±ΠΈΡ‚ΠΎΠ².

1

2

3

4

5

6

7

8

9

10

11

12

13

14

18

19

20

21

22

23

24

25

26

27

28

29

30

0009 34

#include

#include

#include

int main ()

{

constexpr std :: bitset <8> mask0 {0b0000'0001}; // прСдставляСт Π±ΠΈΡ‚ 0

constexpr std :: bitset <8> mask1 {0b0000'0010}; // прСдставляСт Π±ΠΈΡ‚ 1

constexpr std :: bitset <8> mask2 {0b0000'0100}; // прСдставляСт Π±ΠΈΡ‚ 2

constexpr std :: bitset <8> mask3 {0b0000'1000}; // прСдставляСт Π±ΠΈΡ‚ 3

constexpr std :: bitset <8> mask4 {0b0001'0000}; // прСдставляСт Π±ΠΈΡ‚ 4

constexpr std :: bitset <8> mask5 {0b0010'0000}; // прСдставляСт Π±ΠΈΡ‚ 5

constexpr std :: bitset <8> mask6 {0b0100'0000}; // прСдставляСт Π±ΠΈΡ‚ 6

constexpr std :: bitset <8> mask7 {0b1000'0000}; // прСдставляСт Π±ΠΈΡ‚ 7

std :: bitset <8> flags {0b0000'0101}; // Π Π°Π·ΠΌΠ΅Ρ€ 8 Π±ΠΈΡ‚ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ мСсто для 8 Ρ„Π»Π°Π³ΠΎΠ²

std :: cout << "bit 1 is" ​​<< (flags.= (маска1 | маска2); // ΠΏΠ΅Ρ€Π΅Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π±ΠΈΡ‚Ρ‹ 1 ΠΈ 2

std :: cout << "Π±ΠΈΡ‚ 1 Ρ€Π°Π²Π΅Π½" << (flags.test (1)? "on \ n": "off \ n");

std :: cout << "Π±ΠΈΡ‚ 2 Ρ€Π°Π²Π΅Π½" << (flags.test (2)? "On \ n": "off \ n");

Ρ„Π»Π°Π³ΠΎΠ² | = (маска1 | маска2); // Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΡ‚Ρ‹ 1 ΠΈ 2

std :: cout << "Π±ΠΈΡ‚ 1 Ρ€Π°Π²Π΅Π½" << (flags.test (1)? "on \ n": "off \ n");

std :: cout << "Π±ΠΈΡ‚ 2 Ρ€Π°Π²Π΅Π½" << (flags.test (2)? "On \ n": "off \ n");

Ρ„Π»Π°Π³ΠΎΠ² & = ~ (маска1 | маска2); // ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΡ‚Ρ‹ 1 ΠΈ 2

std :: cout << "Π±ΠΈΡ‚ 1 Ρ€Π°Π²Π΅Π½" << (flags.тСст (1)? Β«Π²ΠΊΠ» \ ΠΏΒ»: Β«Π²Ρ‹ΠΊΠ» \ ΠΏΒ»);

std :: cout << "Π±ΠΈΡ‚ 2 Ρ€Π°Π²Π΅Π½" << (flags.test (2)? "On \ n": "off \ n");

Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;

}

Π­Ρ‚ΠΎ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ:

 Π±ΠΈΡ‚ 1 Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 2 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 1 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 2 Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 1 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 2 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 1 Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½
Π±ΠΈΡ‚ 2 Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½
 

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Ρ… Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… масок

ΠŸΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ нашим Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ маскам ΠΈΠΌΠ΅Π½ «маска1Β» ΠΈΠ»ΠΈ «маска2Β» сообщаСт Π½Π°ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ Π±ΠΈΡ‚ обрабатываСтся, Π½ΠΎ Π½Π΅ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΉ Π½Π° Ρ‚ΠΎ, для Ρ‡Π΅Π³ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ этот Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ„Π»Π°Π³.

Π›ΡƒΡ‡ΡˆΠ΅ всСго Π΄Π°Π²Π°Ρ‚ΡŒ вашим Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ маскам ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π°ΡˆΠΈΡ… Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ². Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΠΈΠ³Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

18

19

20

21

22

23

24

25

26

#include

#include

int main ()

{

// ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π½Π°Π±ΠΎΡ€ физичСских / ΡΠΌΠΎΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… состояний

constexpr std :: uint_fast8_t isHungry {1 << }; // 0000 0001

constexpr std :: uint_fast8_t isSad {1 << 1}; // 0000 0010

constexpr std :: uint_fast8_t isMad {1 << 2}; // 0000 0100

constexpr std :: uint_fast8_t isHappy {1 << 3}; // 0000 1000

constexpr std :: uint_fast8_t isLaughing {1 << 4}; // 0001 0000

constexpr std :: uint_fast8_t isAsleep {1 << 5}; // 0010 0000

constexpr std :: uint_fast8_t isDead {1 << 6}; // 0100 0000

constexpr std :: uint_fast8_t isCrying {1 << 7}; // 1000 0000

std :: uint_fast8_t me {}; // всС Ρ„Π»Π°Π³ΠΈ / ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ для запуска

me | = (isHappy | isLaughing); // Π― счастлив ΠΈ смСюсь

мСня & = ~ isLaughing; // Я большС нС смСюсь

// Запрос Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… состояний

// (ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ static_cast , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΊΠ°ΠΊ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅)

std :: cout << "Π― счастлив? "<< static_cast (me & isHappy) << '\ n';

std :: cout << "Я смСюсь?" << static_cast (me & isLaughing) << '\ n';

Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;

}

Π’ΠΎΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ с использованиСм std :: bitset:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

18

19

20

21

22

23

24

25

26

#include

#include

int main ()

{

// ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ физичСских / ΡΠΌΠΎΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… состояний

std :: bitset <8> isHungry {0b0000 ' 0001};

std :: bitset <8> isSad {0b0000'0010};

std :: bitset <8> isMad {0b0000'0100};

std :: bitset <8> isHappy {0b0000'1000};

std :: bitset <8> isLaughing {0b0001'0000};

std :: bitset <8> isAsleep {0b0010'0000};

std :: bitset <8> isDead {0b0100'0000};

std :: bitset <8> isCrying {0b1000'0000};

std :: bitset <8> me {}; // всС Ρ„Π»Π°Π³ΠΈ / ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ для запуска

me | = (isHappy | isLaughing); // Π― счастлив ΠΈ смСюсь

мСня & = ~ isLaughing; // Я большС нС смСюсь

// Π—Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ нСсколько состояний (ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ any (), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ Π»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π±ΠΈΡ‚Ρ‹)

std :: cout << "Π― счастлив?" << ( ΠΌΠ½Π΅ & isHappy).any () << '\ n';

std :: cout << "Я смСюсь?" << (me & isLaughing) .any () << '\ n';

Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;

}

Π—Π΄Π΅ΡΡŒ Π΄Π²Π° примСчания. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, std :: bitset Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π±ΠΈΡ‚Ρ‹ с использованиСм Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ маски. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски, Π° Π½Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ индСксы, Π²Π°ΠΌ придСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Bitwise AND для запроса Π±ΠΈΡ‚ΠΎΠ². Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ any (), которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ истину, Ссли ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π±ΠΈΡ‚Ρ‹ установлСны, ΠΈ лоТь Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, остаСтся Π»ΠΈ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹ΠΉ Π½Π°ΠΌΠΈ Π±ΠΈΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ.

Когда Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹?

ΠŸΡ€ΠΎΠ½ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ экономят ΠΏΠ°ΠΌΡΡ‚ΡŒ. 8 логичСских Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ 8 Π±Π°ΠΉΡ‚ΠΎΠ². Но Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ 9 Π±Π°ΠΉΡ‚ΠΎΠ² (8 Π±Π°ΠΉΡ‚ΠΎΠ² для опрСдСлСния Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… масок ΠΈ 1 Π±Π°ΠΉΡ‚ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ„Π»Π°Π³Π°)!

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ наибольший смысл, ΠΊΠΎΠ³Π΄Π° Ρƒ вас ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ„Π»Π°Π³ΠΎΠ². НапримСр, Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° (мСня) Ρƒ вас Π±Ρ‹Π»ΠΎ 100. Если Π²Ρ‹ использовали 8 логичСских Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ состояния), Π²Ρ‹ использовали Π±Ρ‹ 800 Π±Π°ΠΉΡ‚ памяти.Π‘ Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ Ρ„Π»Π°Π³Π°ΠΌΠΈ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 8 Π±Π°ΠΉΡ‚ΠΎΠ² для Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… масок ΠΈ 100 Π±Π°ΠΉΡ‚ΠΎΠ² для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ², Π² ΠΎΠ±Ρ‰Π΅ΠΉ слоТности 108 Π±Π°ΠΉΡ‚ΠΎΠ² памяти - ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 8 Ρ€Π°Π· мСньшС памяти.

Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ объСм памяти, сохранСнный с использованиСм Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ², Π½Π΅ стоит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… слоТностСй. Но Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, Π³Π΄Π΅ Π΅ΡΡ‚ΡŒ дСсятки тысяч ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹ ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², использованиС Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ сущСствСнно ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ использованиС памяти. Π­Ρ‚ΠΎ полСзная оптимизация, Ссли ΠΎΠ½Π° Π²Π°ΠΌ понадобится.

Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ случай, ΠΊΠΎΠ³Π΄Π° Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ ΠΈ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ смысл.ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ функция, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ ΠΈΠ· 32 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ². Один ΠΈΠ· способов Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 32 ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… логичСских ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

void someFunction (bool option1, bool option2, bool option3, bool option4, bool option5, bool option6, bool option7, bool option8, bool option9, bool option10, bool option11, bool option12, bool option13, bool option14, bool option15, bool option16, bool option17, bool option18, bool option19, bool option20, bool option21, bool option22, bool option23, bool option24, bool option25, bool option26, bool option27, bool option28, bool option29, bool option30, bool option31, bool option32 );

НадСюсь, Π²Ρ‹ Π΄Π°Π΄ΠΈΡ‚Π΅ своим ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, Π½ΠΎ ΡΡƒΡ‚ΡŒ здСсь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ, насколько нСприятно Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π—Π°Ρ‚Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ 10 ΠΈ 32, установлСнными Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

someFunction (лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, истина, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, лоТь, истина);

Π­Ρ‚ΠΎ Π΄ΠΎ смСшного слоТно Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ (это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ 9, 10 ΠΈΠ»ΠΈ 11, установлСнный Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true?), А Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ соотвСтствуСт ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ (устанавливаСт Β«Ρ„Π»Π°Π³ рСдактирования» 9, 10, ΠΈΠ»ΠΈ 11-ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€?) Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ 32 логичСских значСния ΠΈΠ· Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

ВмСсто этого, Ссли Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

void someFunction (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ std :: bitset <32>);

Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹:

someFunction (option10 | option32);

Π­Ρ‚ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ для чтСния, Π½ΠΎ ΠΈ, вСроятно, Π±ΡƒΠ΄Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всСго 2 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π˜Π›Π˜ ΠΈ ΠΎΠ΄Π½Ρƒ копию ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°).

Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ OpenGL, Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π·Π°Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π²ΡˆΠ°Ρ сСбя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, Ρ€Π΅ΡˆΠΈΠ»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ² вмСсто ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… логичСских ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· OpenGL:

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // ΠΎΡ‡ΠΈΡ‰Π°Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€ Ρ†Π²Π΅Ρ‚Π° ΠΈ Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹

GL_COLOR_BUFFER_BIT ΠΈ GL_DEPTH_BUFFER_BIT - это Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (Π² gl2.Π²):

#define GL_DEPTH_BUFFER_BIT 0x00000100

#define GL_STENCIL_BUFFER_BIT 0x00000400

#define GL_COLOR_BUFFER_BIT 0x00004000

Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ нСсколько Π±ΠΈΡ‚ΠΎΠ²

Π₯отя Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π²Ρ‹Π±ΠΎΡ€Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°, ΠΈΡ… Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π²Ρ‹Π±ΠΎΡ€Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±ΠΈΡ‚ΠΎΠ². Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Π±ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ это Π΄Π΅Π»Π°Π΅ΠΌ.

Устройства Ρ†Π²Π΅Ρ‚Π½ΠΎΠ³ΠΎ отобраТСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ‚Π΅Π»Π΅Π²ΠΈΠ·ΠΎΡ€Ρ‹ ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Ρ‹, состоят ΠΈΠ· ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² пиксСлСй, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ. ЦвСтная Ρ‚ΠΎΡ‡ΠΊΠ° состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… свСтовых Π»ΡƒΡ‡Π΅ΠΉ: красного, Π·Π΅Π»Π΅Π½ΠΎΠ³ΠΎ ΠΈ синСго (RGB). ИзмСняя ΠΈΠ½Ρ‚Π΅Π½ΡΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ любой Ρ†Π²Π΅Ρ‚ Π² Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΌ спСктрС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ количСство R, G ΠΈ B для Π΄Π°Π½Π½ΠΎΠ³ΠΎ пиксСля прСдставлСно 8-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ Ρ†Π΅Π»Ρ‹ΠΌ числом Π±Π΅Π· Π·Π½Π°ΠΊΠ°. НапримСр, красный пиксСль Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ R = 255, G = 0, B = 0. Π£ Ρ„ΠΈΠΎΠ»Π΅Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ пиксСля R = 255, G = 0, B = 255.Π‘Ρ€Π΅Π΄Π½Π΅-сСрый пиксСль Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ R = 127, G = 127, B = 127.

ΠŸΡ€ΠΈ присвоСнии Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ†Π²Π΅Ρ‚Π° пиксСлю, ΠΏΠΎΠΌΠΈΠΌΠΎ R, G ΠΈ B, часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ 4-Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ A. Β«AΒ» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«Π°Π»ΡŒΡ„Π°Β», ΠΈ ΠΎΠ½ опрСдСляСт, насколько ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ†Π²Π΅Ρ‚. Если A = 0, Ρ†Π²Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ. Если A = 255, Ρ†Π²Π΅Ρ‚ Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ.

R, G, B ΠΈ A ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ хранятся ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число, с 8 Π±ΠΈΡ‚Π°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:

32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ RGBA
Π±ΠΈΡ‚ 31-24 Π±ΠΈΡ‚ 23-16 Π±ΠΈΡ‚ 15-8 Π±ΠΈΡ‚ 7-0
RRRRRRRR GGGGGGGG BBBBBBBB AAAAAAAA
красный Π·Π΅Π»Π΅Π½Ρ‹ΠΉ синий Π°Π»ΡŒΡ„Π°

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° просит ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ввСсти 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ 8-Π±ΠΈΡ‚Π½Ρ‹Π΅ значСния Ρ†Π²Π΅Ρ‚Π° для R, G, B ΠΈ A.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

18

19

20

21

22

23

24

25

26

27

28

29

30

#include

#include

int main ()

{

constexpr std :: uint_fast32_t redBits {0xFF000000};

constexpr std :: uint_fast32_t greenBits {0x00FF0000};

constexpr std :: uint_fast32_t blueBits {0x0000FF00};

constexpr std :: uint_fast32_t alphaBits {0x000000FF};

std :: cout << "Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° RGBA Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,Π³Ρ€Π°ΠΌΠΌ. FF7F3300): ";

std :: uint_fast32_t pixel {};

std :: cin >> std :: hex >> pixel; // std :: hex позволяСт Π½Π°ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅

/ / ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ И для выдСлСния красных пиксСлСй,

// Π·Π°Ρ‚Π΅ΠΌ ΡΠ΄Π²ΠΈΠ½ΡŒΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²ΠΏΡ€Π°Π²ΠΎ Π² младшиС 8 Π±ΠΈΡ‚

std :: uint_fast8_t red {static_cast ((pixel & redBits) >> 24)};

std :: uint_fast8_t Π·Π΅Π»Π΅Π½Ρ‹ΠΉ {static_cast ((pixel & greenBits) >> 16)};

std :: uint_fast8_t синий {static_cast ((pixel & blueBits) >> 8)};

std :: uint_fast8_t alpha {static_cast (pixel & alphaBits)};

std :: cout << "Π’Π°Ρˆ Ρ†Π²Π΅Ρ‚ содСрТит: \ n";

std :: cout << std :: hex; // Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅

std :: cout << static_cast (red) << "red \ n";

std :: cout << static_cast (Π·Π΅Π»Π΅Π½Ρ‹ΠΉ) << "Π·Π΅Π»Π΅Π½Ρ‹ΠΉ \ n";

std :: cout << static_cast (синий) << "синий \ n" ;

std :: cout << static_cast (alpha) << "alpha \ n";

Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;

}

Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

 Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° RGBA Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,Π³Ρ€Π°ΠΌΠΌ. FF7F3300): FF7F3300
Π’Π°Ρˆ Ρ†Π²Π΅Ρ‚ содСрТит:
ff красный
7f Π·Π΅Π»Π΅Π½Ρ‹ΠΉ
33 синий
0 Π°Π»ΡŒΡ„Π°
 

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ поразрядноС И для запроса Π½Π°Π±ΠΎΡ€Π° ΠΈΠ· 8 ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΡ… нас Π±ΠΈΡ‚ΠΎΠ², Π° Π·Π°Ρ‚Π΅ΠΌ сдвигаСм ΠΈΡ… Π²ΠΏΡ€Π°Π²ΠΎ Π² 8-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΠΈΡ… ΠΊΠ°ΠΊ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ значСния.

Π‘Π²ΠΎΠ΄ΠΊΠ°

ΠžΠ±ΠΎΠ±Ρ‰Π°Ρ, ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ, ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ:

Для запроса состояний Π±ΠΈΡ‚ΠΎΠ² ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ И :

Ссли (Ρ„Π»Π°Π³ΠΈ ΠΈ опция4)... // Ссли установлСн option4, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ

Для установки Π±ΠΈΡ‚ΠΎΠ² (Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π˜Π›Π˜ :

Ρ„Π»Π°Π³ΠΎΠ² | = option4; // Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΎΠΏΡ†ΠΈΡŽ 4.

Ρ„Π»Π°Π³ΠΎΠ² | = (option4 | option5); // Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ 4 ΠΈ 5.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Π±ΠΈΡ‚Ρ‹ (Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ), ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ И с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ НЕ :

flags & = ~ option4; // ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΎΠΏΡ†ΠΈΡŽ 4

flags & = ~ (option4 | option5); // ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ 4 ΠΈ 5

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ состояния, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜ :

Ρ„Π»Π°Π³ΠΎΠ² ^ = option4; // ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ option4 с on Π½Π° off ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚

flags ^ = (option4 | option5); // ΠΏΠ΅Ρ€Π΅Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ 4 ΠΈ 5

ВрСмя Π²ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Ρ‹

НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ std :: bitset Π² этой Π²ΠΈΠΊΡ‚ΠΎΡ€ΠΈΠ½Π΅.ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ std :: bitset .

Π”Π°Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

18

19

20

#include

#include

#include

int main ()

{

constexpr std :: uint_fast8_t option_viewed {0x01};

constexpr std :: uint_fast8_t option_edited {0x02};

constexpr std :: uint_fast8_t option_favorited {0x04};

constexpr std :: uint_fast8_t option_shared {0x08};

constexpr std :: uint_fast8_t option_deleted {0x10};

std :: uint_fast8_t myArticleFlags {option_favorited};

//...

std :: cout << std :: bitset <8> {myArticleFlags} << '\ n';

Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ 0;

}

a) ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ строку ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ просматриваСмой.
ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

 00000101
 

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅

myArticleFlags | = option_viewed;

Π±) ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ строку ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π±Ρ‹Π»Π° Π»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π° ΡΡ‚Π°Ρ‚ΡŒΡ.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅

if (myArticleFlags & option_deleted) ...

c) ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ строку ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΊΠ°ΠΊ ΠΈΠ·Π±Ρ€Π°Π½Π½ΡƒΡŽ.
ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ (ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΡ€ΠΎΡˆΠ»ΠΈ тСст (Π°)):

 00000001
 

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅

myArticleFlags & = ~ option_favorited;

1d) Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΡ€Π΅Π΄ΠΈΡ‚: ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ строки ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹?

myflags & = ~ (option4 | option5); // ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΎΠΏΡ†ΠΈΠΈ 4 ΠΈ 5

myflags & = ~ option4 & ~ option5; // ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ 4 ΠΈ 5

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅

Π—Π°ΠΊΠΎΠ½ Π”Π΅ ΠœΠΎΡ€Π³Π°Π½Π° гласит, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ распространяСм НЕ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π˜Π›Π˜ ΠΈ И Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅.Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ~ (option4 | option5) становится ~ option4 & ~ option5 .

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹. Π˜Π·ΡƒΡ‡ΠΈΡ‚Π΅ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ манипуляции | Π”Π΅Π²ΠΈΠ½ Π‘ΠΎΠ½ΠΈ πŸ‘‘

Если Π½Π΅ совсСм понятно, Π·Π°Ρ‡Π΅ΠΌ Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ эти ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ - Π²Ρ‹ Π½Π΅ ΠΎΠ΄ΠΈΠ½ΠΎΠΊΠΈ. Когда я Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΡƒΠ·Π½Π°Π» ΠΎ Π½ΠΈΡ…, ΠΎΠ½ΠΈ Π½Π΅ казались Ρ‚Π°ΠΊΠΈΠΌΠΈ ΡƒΠΆ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ.

Но Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… областях, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ встроСнноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, систСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ сСти, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ… мноТСства Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ, надСюсь, Π²Ρ‹ Π½Π°Ρ‡Π½Π΅Ρ‚Π΅ ΠΈΡ… большС Ρ†Π΅Π½ΠΈΡ‚ΡŒ.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ - ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ способ ΠΎΡ‡Π΅Π½ΡŒ эффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ пространство ΠΏΡ€ΠΈ прСдставлСнии Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ:

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

Наивный способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это - просто ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ваш сСрвСр (ΠΎΠ΄Π½ΠΎ для ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ x ΠΈ ΠΎΠ΄Π½ΠΎ для ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ y) для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ снимка.ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Ρ†Π΅Π»Ρ‹Π΅ числа ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ 32 Π±ΠΈΡ‚Π°, поэтому это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ 64 Π±ΠΈΡ‚Π° Π΄Π°Π½Π½Ρ‹Ρ….

Однако ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ поразрядныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹.

Π’Π°ΠΊ ΠΊΠ°ΠΊ каТдая ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 1000, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 10 Π±ΠΈΡ‚ для хранСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ числа, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ 1111111111 Ρ€Π°Π²Π΅Π½ 1023, Ρ‡Ρ‚ΠΎ большС 1000. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ всСго 20 Π±ΠΈΡ‚.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ эти 20 Π±ΠΈΡ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ 32-Π±ΠΈΡ‚Π½ΠΎΠΌ Ρ†Π΅Π»ΠΎΠΌ числС - ΠΊΡ€Π°ΠΉΠ½ΠΈΠ΅ ΠΏΡ€Π°Π²Ρ‹Π΅ 10 Π±ΠΈΡ‚ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ x, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ 10 Π±ΠΈΡ‚ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ y, Π° ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ 12 Π±ΠΈΡ‚ Π±ΡƒΠ΄ΡƒΡ‚ просто Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Π½Π½Ρ‹Π΅ достигнут Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ сСрвСра, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ число с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ сдвига ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Π˜Π›Π˜.

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ свойства base-2

ΠΠ°Ρ…ΠΎΠ΄ΡΡΡŒ Π² base-2, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ нСсколько ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… свойств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π»Π΅Π³ΠΊΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ вопросы.

НапримСр, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ число ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ 2.

Π£ любого числа, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ 2, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΡ€Π°ΠΉΠ½ΠΈΠΉ Π»Π΅Π²Ρ‹ΠΉ Π±ΠΈΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ установлСн Π² 1, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π²Π½Ρ‹ 0.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ быстро ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, слСдуСт Π»ΠΈ этому ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ число x , ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ², соотвСтствуСт Π»ΠΈ (x & (x - 1)) == 0 .y .

НайдитС СдинствСнноС Ρ†Π΅Π»ΠΎΠ΅ число Π² массивС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ встрСчаСтся Π΄Π²Π°ΠΆΠ΄Ρ‹

ΠœΡ‹ выполняСм ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ XOR для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² массивС. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ число XOR’d с самим собой Ρ€Π°Π²Π½ΠΎ 0, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ суммы послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ пройдСмся ΠΏΠΎ всСму массиву, Π±ΡƒΠ΄Π΅Ρ‚ Ρ†Π΅Π»Ρ‹ΠΌ числом, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ встрСчаСтся Π΄Π²Π°ΠΆΠ΄Ρ‹.

Π‘ΠΈΡ‚ / байтовая Π΄Π²ΠΎΠΉΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ - докумСнтация Construct 2.10

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ

Π’ Construct 1.XX синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΈ построСниС Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ Π½Π° Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅: всС Π΄Π°Π½Π½Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² строку ΠΈΠ· Π΅Π΄ΠΈΠ½ΠΈΡ† ΠΈ Π½ΡƒΠ»Π΅ΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠ³Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ полями.КаТдая конструкция Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° с Π±ΠΈΡ‚Π°ΠΌΠΈ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… (Π½Π°Π·Π²Π°Π½Π½Ρ‹Ρ… ByteXXX), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ ΠΎΠΊΡ‚Π΅Ρ‚Π°ΠΌΠΈ. Π­Ρ‚ΠΎ упростило Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Ρ„Π»Π°Π³ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° TCP, 7-Π±ΠΈΡ‚Π½Ρ‹Π΅ символы ASCII ΠΈΠ»ΠΈ поля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Ρ‹ ΠΏΠΎ Π³Ρ€Π°Π½ΠΈΡ†Π΅ Π±Π°ΠΉΡ‚Π° (ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚Ρ‹ ΠΈ Π΄Ρ€.).

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π±Ρ‹Π» простым ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΌ, Π½ΠΎ ΠΈΠΌΠ΅Π» Π΄Π²Π° основных нСдостатка:

  • Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Ρ‹ ΠΏΠΎ Π±Π°ΠΉΡ‚Π°ΠΌ (Π·Π° ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ)
  • НакладныС расходы слишком Π²Π΅Π»ΠΈΠΊΠΈ

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ конструкции Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с Π±ΠΈΡ‚Π°ΠΌΠΈ, Π΄Π°Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ сначала ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ строку, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ вСсь Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти.НС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это, Π½ΠΎ Π²Ρ‹ фактичСски содСрТали Π² 8 Ρ€Π°Π· большС исходных Π΄Π°Π½Π½Ρ‹Ρ… (это Π±Ρ‹Π»Π° битовая строка). Богласно Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ мною тСстам, Π²Ρ‹ Π±Ρ‹Π»ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΎΠΊΠΎΠ»ΠΎ 50 ΠœΠ‘ (ΠΈ это Π±Ρ‹Π»ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΈΠ·-Π·Π° ΠΏΠ΅Ρ€Π΅Π±ΠΎΠ΅Π² Π½Π° страницС).

Π˜Ρ‚Π°ΠΊ, начиная с Construct 2.XX, всС конструкции Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π±Π°ΠΉΡ‚Π°ΠΌΠΈ:

  • МСньшС ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти
  • НСт Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π°ΠΉΡ‚Π°ΠΌΠΈ ΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ
  • ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° встроСнный структурный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Python для числовой ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ / распаковки (быстрСС ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½ΠΎ)
  • ΠœΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (Π±Π΅Π· Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² памяти)

Но ΠΊΠ°ΠΊ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ? ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ явно Π·Π°ΡΠ²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ: ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ поля, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ BitsInteger (Bit Nibble Octet ΡΠ²Π»ΡΡŽΡ‚ΡΡ экзСмплярами BitsInteger), ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΈ построСниС Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… строк.Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ нСсколько ΠΏΠΎΠ»Π΅ΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Struct ΠΈ Flag, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ°ΠΊ с Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊ ΠΈ с Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ строками.

BitStruct

BitStruct - это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ конструкций, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ / строятся Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ порядкС, ΠΊΠ°ΠΊ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ структуры. Π Π°Π·Π½ΠΈΡ†Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ BitStruct Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π±ΠΈΡ‚Π°ΠΌΠΈ, Π° Π½Π΅ с Π±Π°ΠΉΡ‚Π°ΠΌΠΈ. ΠŸΡ€ΠΈ синтаксичСском Ρ€Π°Π·Π±ΠΎΡ€Π΅ BitStruct Π΄Π°Π½Π½Ρ‹Π΅ сначала ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ (ΠΏΠΎΡ‚ΠΎΠΊ \ x01 ΠΈ \ x00), ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ½ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² подконструкции. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ подконструкции Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±ΠΈΡ‚Π°ΠΌΠΈ, Π° Π½Π΅ с Π±Π°ΠΉΡ‚Π°ΠΌΠΈ.Для справки посмотритС ΠΊΠΎΠ΄ Π½ΠΈΠΆΠ΅:

 >>> d = BitStruct (
...     "Ρ„Π»Π°Π³,
... "б" / КлСв,
... "c" / BitsInteger (10),
... "d" / Padding (1),
...)
>>> d.parse (b "\ xbe \ xef")
ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ (a = True, b = 7, c = 887, d = None)
>>> d.sizeof ()
2
 

BitStruct Π½Π° самом Π΄Π΅Π»Π΅ являСтся просто ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ для Bitwise Π²ΠΎΠΊΡ€ΡƒΠ³ Struct .

Поля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

НСкоторыС простыС поля (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Flag Padding Pass Terminated) ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ Π³Ρ€Π°Π½ΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚.ЀактичСская ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ зависит ΠΎΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… слоСв. Π’ΠΎ ΠΆΠ΅ самоС относится ΠΊ классам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Π°ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Enum EnumFlags. Π­Ρ‚ΠΈ классы Π½Π΅ заботятся ΠΎ гранулярности, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π΅Π³ΠΎ подконструкциями.

Π’ΠΎΡ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π±Π°ΠΉΡ‚Π°ΠΌΠΈ:

 >>> d = Struct (
... ΠŸΡ€ΠΎΠΊΠ»Π°Π΄ΠΊΠ° (2),
... "x" / Π€Π»Π°Π³,
... ΠŸΡ€ΠΎΠΊΠ»Π°Π΄ΠΊΠ° (5),
...)
>>> d.build (dict (x = 5))
Π± '\ x00 \ x00 \ x01 \ x00 \ x00 \ x00 \ x00 \ x00'
>>> d.sizeof ()
8
 

А Π²ΠΎΡ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π±ΠΈΡ‚Π°ΠΌΠΈ.ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ - BitStruct вмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Struct:

 >>> d = ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ (Struct (
... ΠŸΡ€ΠΎΠΊΠ»Π°Π΄ΠΊΠ° (2),
... "x" / Π€Π»Π°Π³,
... ΠŸΡ€ΠΎΠΊΠ»Π°Π΄ΠΊΠ° (5),
...))
>>> d.build (dict (x = 5))
Π± ''
>>> d.sizeof ()
1
 

Π˜Ρ‚Π°ΠΊ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ «классичСской конструкции», Π½Π΅Ρ‚ нСобходимости Π² BytePadding ΠΈ BitPadding. Если Padding Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² BitStruct, ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π±ΠΈΡ‚Π°ΠΌΠΈ, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π±Π°ΠΉΡ‚Π°ΠΌΠΈ.

Поля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ выходят ΠΈΠ· строя

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ классы ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Bitwise Bytewise Π² зависимости ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π².ЀактичСски этот Ρ€Π°Π·Π΄Π΅Π» Ρ‚Π°ΠΊΠΆΠ΅ относится ΠΊ ByteSwapped BitsSwapped. Π­Ρ‚ΠΈ 4 макроса Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ Π»ΠΈΠ±ΠΎ Π² Transformed, Π»ΠΈΠ±ΠΎ Π² Restreamed, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ subcon фиксированный Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ. Если Π΄Π°, Ρ‚ΠΎ ΠΎΠ½ прСвращаСтся Π² Transformed ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, это Π½Π΅ Ρ‚Π°ΠΊ, Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ½ прСвращаСтся Π² Restreamed, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ RestreamedBytesIO, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π² Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΎΠ±Π΅Π³ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ.

Π’Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ поиск ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ»ΠΈ сообщСниС (ΠΈΠ»ΠΈ ΠΈ Ρ‚ΠΎ, ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅):

  • Π–Π°Π΄Π½Ρ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½
  • Боюз
  • Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ
  • Padded (Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚)
  • Π’Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½ (Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚)
  • Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ
  • ΠŸΠΎΠ΄Π³Π»ΡΠ΄Ρ‹Π²Π°Ρ‚ΡŒ
  • ΠΈΡΠΊΠ°Ρ‚ΡŒ
  • Π‘ΠΊΠ°ΠΆΠΈΡ‚Π΅
  • RawCopy
  • с прСфиксом (Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚)
  • PrefixedArray (Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚)
  • NullTerminated (Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ссли ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ = False)
  • LazyStruct
  • LazyArray

.

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

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