4-bo‘lim

Bitlar bilan ishlash

AND, OR, XOR va NOT amallari, surish, bayroqlar va niqoblar, maydonlarni ajratib olish va foydali bit hiylalari.

🕑 10 daqiqa o‘qish 📄 1 439 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. To'rtta asosiy amal
  2. Surish - eng arzon ko'paytirish
  3. Bayroqlar va niqoblar
  4. Maydonlarni ajratib olish
  5. Xulosa

Protsessor sonlarni qo'sha oladi, lekin uning eng tabiiy ishi boshqa: bitlar ustida bir vaqtda amal bajarish.

Bu amallar eng arzon va eng tez - ular bir taktda bajariladi.

To'rtta asosiy amal #

Bu amallar bir vaqtda butun bayt ustida ishlaydi. Ikkita son olaylik:

IkkilikdaO'nlikda
a11001010202
b10110110182

Endi to'rt amalni qo'llaymiz:

AmalNatijaO'nlikdaQoidasi
a VA b10000010130ikkalasi ham 1 bo'lsa
a YOKI b11111110254bittasi 1 bo'lsa yetarli
a XOR b01111100124farq qilsa 1
EMAS a0011010153hamma bit teskari

Har bir bit juftligi uchun qoida shunday:

abVAYOKIXOR
00000
01011
10011
11110

Bu jadval 8-bo'limda temirda qurgan elementlarning aynan o'zi - faqat u yerda bitta bit, bu yerda esa sakkiztasi birdan.

Eng muhim: & va && bir xil emas.

AmalNima qiladiNatijasi
&Har bit ustida alohidaSon
andButun qiymat ustidaRost yoki yolg'on

6 & 3 ikkita bo'ladi (110 & 011 = 010), 6 and 3 esa 3 qaytaradi. Butunlay boshqa amallar.

XOR ning uchta xossasi

^ (eksklyuziv YOKI) - "faqat bittasi 1 bo'lsa" degani. Uning uchta xossasi juda ko'p ishlatiladi:

XossaNatija
a ^ a0 - har doim
a ^ 0a - o'zgarmaydi
a ^ b ^ ba - qaytarib olinadi

Uchinchisi eng qimmatli: XOR o'z-o'zini bekor qiladi.

Shuning uchun u juftlik tekshiruvida (parity), RAID massivlarida va eng sodda shifrlashda ishlatiladi.

E'tibor bering: oddiy XOR shifrlash emas. Kalit takrorlansa uni buzish oson. Haqiqiy shifrlash "Amaliy kriptografiya" darsligida ko'rilgan.

Surish - eng arzon ko'paytirish #

Surish - bitlarni yonma-yon siljitish 22 sonini CHAPGA suramiz asl 0 0 0 1 0 1 1 0 = 22 1 ga 0 0 1 0 1 1 0 0 = 44 o'ngdan nol keladi 2 ga 0 1 0 1 1 0 0 0 = 88 bitlar shu tomonga siljiydi Chapga surish Har surish sonni 2 GA KO'PAYTIRADI 22 → 44 → 88 → 176 O'ngdan bo'sh o'rinlarga nol keladi Chapdagi bitlar chiqib ketishi mumkin O'ngga surish Har surish sonni 2 GA BO'LADI 22 → 11 → 5 → 2 Kasr qismi tashlanadi, butun qismi qoladi Protsessor uchun bu eng arzon amal
Surish - ko'paytirishdan tez, chunki bu shunchaki simlarni siljitish

Raqamlarda ko'rsak:

SurishIkkilikdaQiymatiBu nima
22 chapga 0000101102222 × 1
22 chapga 1001011004422 × 2
22 chapga 2010110008822 × 4
22 chapga 31011000017622 × 8

O'ngga surish esa teskarisi:

SurishIkkilikdaQiymatiBu nima
22 o'ngga 0000101102222 ÷ 1
22 o'ngga 1000010111122 ÷ 2
22 o'ngga 200000101522 ÷ 4
22 o'ngga 300000010222 ÷ 8
Chapga surganda bitlar yo'qolishi mumkin

Sakkiz bitli sonni chapga surganda, chap chetidan chiqib ketgan bitlar qaytmaydi:

Surish8 bitda qoladiNima bo'ldi
010110000joyida
101100000bir bit yo'qoldi
211000000yana bir bit yo'qoldi

Shuning uchun surishni ko'paytirish o'rniga ishlatganda, natija razryadga sig'ishiga ishonch hosil qiling.

"Surish tezroq" - bu tushuntirish, maslahat emas

Surish ko'paytirishdan arzon ekani rost. Lekin bundan "demak har doim surishni ishlatish kerak" degan xulosa chiqmaydi.

Sabab: zamonaviy kompilyator × 8 ni ko'rsa, uni o'zi surishga aylantiradi - va buni sizdan yaxshiroq qiladi, chunki u butun kontekstni ko'radi.

Surish bitlar bilan ishlaganda o'z o'rnida: maydon ajratish, niqob yasash, bayroqlar bilan ishlash. Oddiy hisob-kitobda esa odatdagi ko'paytirish tushunarliroq.

Bayroqlar va niqoblar #

Bir nechta "ha/yo'q" qiymatini bitta songa sig'dirish - eng ko'p uchraydigan naqsh:

Bitta son - bir nechta "ha/yo'q" 1 o'qish (4) 1 yozish (2) 0 bajarish (1) 4 + 2 + 0 = 6 To'rtta asosiy amal x |= BAYROQ yoqish x &= ~BAYROQ o'chirish x ^= BAYROQ almashtirish x & BAYROQ tekshirish Linux huquqlari, TCP bayroqlari, protsessor holati - hammasi shu naqsh
Sakkiz bitli bitta baytga sakkizta mustaqil belgi sig'adi

Bitta baytda bir nechta "ha/yo'q" javobini saqlash mumkin. Har bitga bitta ma'no biriktiriladi:

AmalBitlarQiymatMa'nosi
Boshlanish0000hech narsa
O'qish qo'shildi1004o'qish
Yozish qo'shildi1106o'qish, yozish
Yozish olib tashlandi1004o'qish
Bajarish almashtirildi1015o'qish, bajarish
Yana almashtirildi1004o'qish

Har amal uchun o'z biti bor:

Nima qilmoqchisizQaysi amal
Bayroq qo'shishYOKI
Bayroq bormi deb tekshirishVA
Bayroqni olib tashlashVA + EMAS
Bayroqni almashtirishXOR

Linux dagi tanish 755 ruxsati aynan shu: 0o755 ikkilikda 111101101 - uch guruhga bo'lingan to'qqizta bayroq.

To'rtta asosiy amalni yodlab qo'ying:

MaqsadAmal
Bitni yoqishqiymat |= BAYROQ
Bitni o'chirishqiymat &= ~BAYROQ
Bitni almashtirishqiymat ^= BAYROQ
Bitni tekshirishqiymat & BAYROQ

Linux fayl huquqlari (755), TCP bayroqlari (SYN, ACK), protsessor holat registri - hammasi shu naqsh.

Maydonlarni ajratib olish #

Bir nechta qiymat bitta songa joylashtirilganda, ularni surish va niqob bilan ajratib olinadi:

#AF3C6D rangi aslida bitta 24 bitli son. Undagi uchta rangni ajratib olish uchun surish va niqoblash yetarli:

QismBitlariQiymati
To'liq son101011110011110001101101-
Qizil10101111175
Yashil0011110060
Ko'k01101101109

Qizilni olish uchun sonni 16 bitga o'ngga suramiz va oxirgi 8 bitni niqoblab olamiz. Yashil uchun 8 bitga, ko'k uchun umuman surmaymiz.

Teskari yo'l ham shunday - uchta qiymatni joyiga surib, birlashtirsak, yana #AF3C6D chiqadi.

Bit amallari bilan bir nechta foydali hiyla ham bor:

SonJuftmi2 ning darajasimiNechta biri 1
6hayo'q2
7yo'qyo'q3
8haha1
16haha1
17yo'qyo'q2

Juftlikni bilish uchun eng oxirgi bitga qarash yetarli: u 0 bo'lsa - son juft.

son & (son - 1) nima uchun ishlaydi?

Bu hiyla "son 2 ning darajasimi?" degan savolga javob beradi.

2 ning darajasida faqat bitta bit yoqilgan:

Natija
8     = 1000
8 - 1 = 0111      # eng past bitlar to'ldi
8 & 7 = 0000      # umumiy bit yo'q

Boshqa sonlarda esa hamisha umumiy bit qoladi:

Natija
6     = 0110
6 - 1 = 0101
6 & 5 = 0100      # nol emas

Bu naqsh xesh-jadvallarda keng ishlatiladi: jadval hajmi 2 ning darajasi bo'lsa, hash % hajm o'rniga hash & (hajm - 1) yozish mumkin - va bu ancha tez.

Ishorali sonni o'ngga surish - tuzoq

Manfiy sonni o'ngga surganda ikki xil xulq bo'lishi mumkin:

TuriBo'sh joyga nima keladiNatija
ArifmetikIshora biti takrorlanadiManfiy qoladi
MantiqiyNol keladiKatta musbat son

Protsessorlarda ikkala komanda ham bor va ular alohida kodlar bilan belgilanadi. Qaysi biri ishlatilishi sonning turiga bog'liq: ishorali son uchun arifmetik, ishorasiz son uchun mantiqiy surish tanlanadi.

Shuning uchun bir xil bitlar, bir xil surish - lekin son ishorali yoki ishorasiz deb e'lon qilinganiga qarab natija butunlay boshqa bo'ladi.

Amaliy topshiriq
  1. 11001010 va 10110110 uchun uchala amalni qo'lda bajaring.
  2. a XOR b XOR b nima uchun yana a berishini tushuntiring.
  3. 22 ni chapga 4 marta surganda 8 bitda nima qoladi?
  4. 200 ni o'ngga 3 marta suring - natija qancha?
  5. Ruxsat bayroqlariga to'rtinchi huquq qo'shsangiz, qiymat qanday bo'ladi?
  6. 755 ruxsatini to'qqizta bitga yoyib yozing.
  7. 0x1A2B3C4D dan to'rtta baytni ajratib yozing.
  8. #FF8000 rangining uch qismini toping.
  9. Sonning juftligini bitta bitga qarab qanday bilish mumkin?
  10. Arifmetik va mantiqiy surish farqini uch qatorda yozing.

Xulosa #

  • Bit amallari eng arzon: ular bir taktda bajariladi.
  • & har bit ustida ishlaydi, and esa butun qiymat ustida - aralashtirmang.
  • ^ (XOR) o'z-o'zini bekor qiladi: a ^ b ^ b == a.
  • Chapga surish 2 ga ko'paytiradi, o'ngga surish 2 ga bo'ladi.
  • Qat'iy o'lchamli turda chapga surganda bitlar chiqib ketadi.
  • Surish arzon, lekin oddiy ko'paytirishni surishga almashtirish shart emas.
  • Bayroqlar naqshi: yoqish |=, o'chirish &= ~, almashtirish ^=, tekshirish &.
  • Maydon ajratish: avval surish, keyin niqoblash.
  • son & (son - 1) == 0 - son 2 ning darajasi ekanini tekshiradi.
  • Manfiy sonni o'ngga surish tilga bog'liq - shubhali joyda bo'lishni ishlating.

Keyingi bo'limda haqiqiy sonlarga o'tamiz va nima uchun 0.1 + 0.2 aniq 0.3 bermasligini ko'ramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.