Bit-bitli operatsiya - Bitwise operation

Yilda kompyuter dasturlash, a bitli operatsiya a da ishlaydi bit ip, a bit qatori yoki a ikkilik raqam (bit ip sifatida qaraladi) uning individual darajasida bitlar. Bu yuqori va yuqori darajadagi arifmetik amallar uchun asos bo'lib, to'g'ridan-to'g'ri protsessor. Ko'p sonli operatsiyalar ikkita operandli ko'rsatmalar sifatida taqdim etiladi, bu erda natija kirish operandlaridan birini almashtiradi.

Oddiy arzon protsessorlarda, odatda, bitli operatsiyalar bo'linishdan sezilarli darajada tezroq, ko'paytirilgandan bir necha baravar tezroq, ba'zan esa qo'shilishdan sezilarli darajada tezroq bo'ladi.[tushuntirish kerak ] Zamonaviy protsessorlar odatda qo'shilish va ko'paytirishni bitay amallar singari tezroq bajarishi bilan amalga oshiradilar ko'rsatma quvurlari va boshqalar me'moriy dizayn tanlovi, bitli operatsiyalar odatda kam quvvat sarflaydi, chunki resurslardan foydalanish kamayadi.[1]

Bitwise operatorlari

Quyidagi tushuntirishlarda bitning pozitsiyasining har qanday ko'rsatkichi chap tomonga qarab o'ng (eng kam ahamiyatga ega) tomondan hisoblanadi. Masalan, 0001 ikkilik qiymati (o'nlik 1) har bir pozitsiyada nolga ega, lekin birinchisi (ya'ni eng o'ng tomon).

YO'Q

The bittadan YO'Q, yoki to'ldiruvchi, a bir martalik operatsiya bajaradigan mantiqiy inkor har bir bitda bir-birini to'ldiruvchi berilgan ikkilik qiymatning. 0 bo'lgan bitlar 1 ga, 1 bitlar 0 ga aylanadi. Masalan:

YO'Q 0111 (kasr 7) = 1000 (kasr 8)
10101011 emas (kasr 171) = 01010100 (kasr 84)

Bitsel to‘ldiruvchi tenglamaga teng ikkitasini to'ldiruvchi minus bitta qiymatdan. Agar ikkitasini to'ldiruvchi arifmetikasi ishlatilsa, u holda X = -x - 1 emas.

Imzo qo'yilmaganlar uchun butun sonlar, sonning bitli qo'shimchasi - bu raqamning belgisiz butun son oralig'ining yarim yo'lidagi "ko'zgu aksi". Masalan, 8-bit imzosiz butun sonlar uchun X = 255 - x emas, grafada 0 dan 255 gacha o'sib boruvchi diapazonni, 255 dan 0 gacha kamayishni samarali ravishda "aylantiruvchi" pastga yo'naltirilgan chiziq sifatida tasavvur qilish mumkin. Oddiy, ammo tushunarli misol, har bir piksel joylashgan kulrang tasvirni teskari yo'naltirishdir. imzosiz butun son sifatida saqlanadi.

VA

Bittadan va 4-bit butun sonlar

A bitli va a ikkilik operatsiya ikkita teng uzunlikdagi ikkitomonlama tasvirni qabul qiladigan va bajaradigan mantiqiy VA tegishli bitlarning har bir jufti ustida ishlash, bu ularni ko'paytirishga teng. Shunday qilib, taqqoslangan holatdagi ikkala bit ham 1 ga teng bo'lsa, natijada olingan ikkilik tasvirdagi bit 1 ga teng (1 × 1 = 1); aks holda natija 0 ga teng (1 × 0 = 0 va 0 × 0 = 0). Masalan:

    0101 (kasr 5) va 0011 (kasr 3) = 0001 (o‘nli kasr 1)

Amaliyot ma'lum bir bit ekanligini aniqlash uchun ishlatilishi mumkin o'rnatilgan (1) yoki aniq (0). Masalan, 0011 bitli naqsh (vergul 3) berilgan holda, ikkinchi bit o'rnatilganligini aniqlash uchun biz bittadan VA faqat bitda bittasini o'z ichiga olgan bit naqsh bilan foydalanamiz:

    0011 (kasr 3) va 0010 (kasr 2) = 0010 (kasr 2)

0010 natijasi nolga teng bo'lmaganligi sababli, biz asl naqshdagi ikkinchi bit o'rnatilganligini bilamiz. Bu ko'pincha chaqiriladi ozgina maskalash. (O'xshatishga ko'ra maskalanuvchi lenta qopqoqlar, yoki maskalar, o'zgartirilmasligi kerak bo'lgan qismlar yoki qiziqtirmaydigan qismlar. Bunday holda, 0 qiymatlari qiziq bo'lmagan bitlarni yashiradi.)

BITALAR VA tanlangan bitlarni tozalash uchun ishlatilishi mumkin (yoki bayroqlar ) har bir bit shaxsni ifodalovchi registr Mantiqiy davlat. Ushbu usul, iloji boricha kamroq xotiradan foydalanib, bir qator mantiqiy qiymatlarni saqlashning samarali usuli hisoblanadi.

Masalan, 0110 (kasr 6) to'rtta bayroqlar to'plami deb qaralishi mumkin, bu erda birinchi va to'rtinchi bayroqlar aniq (0), ikkinchi va uchinchi bayroqlar o'rnatilgan (1). Uchinchi bayroqni bittadan VA faqat uchinchi bitda nolga teng bo'lgan naqsh yordamida tozalash mumkin:

    0110 (kasr 6) va 1011 (kasr 11) = 0010 (kasr 2)

Ushbu xususiyat tufayli tekshirishni osonlashtiradi tenglik eng past bit qiymatini tekshirish orqali ikkilik raqamni. Yuqoridagi misoldan foydalanib:

    0110 (kasr 6) VA 0001 (kasr 1) = 0000 (kasr 0)

6 va 1 nolga teng bo'lgani uchun, 6 ikkiga bo'linadi va shuning uchun ham.

Yoki

Bit-bitli yoki 4-bitli butun sonlarning

A bitli YOKI a ikkilik operatsiya teng uzunlikdagi ikkita bitli naqshlarni oladi va bajaradi mantiqiy inklyuziv YOKI mos bitlarning har bir jufti ustida ishlash. Ikkala bit 0 bo'lsa, har bir pozitsiyadagi natija 0 ga teng, aks holda natija 1. Masalan:

   0101 (kasr 5) YOKI 0011 (kasr 3) = 0111 (kasr 7)

Yuqorida tavsiflangan registrning tanlangan bitlarini 1 ga o'rnatish uchun bit usulida OR ishlatilishi mumkin. Masalan, 0010 ning to'rtinchi biti (kasr 2) bit tartibida yoki faqat to'rtinchi bit o'rnatilgan naqsh bilan bajarilishi mumkin:

   0010 (kasr 2) YOKI 1000 (kasr 8) = 1010 (o‘nli kasr)

XOR

4-bitli tamsayılardan bitli XOR

A bitli XOR a ikkilik operatsiya teng uzunlikdagi ikkita bitli naqshlarni oladi va bajaradi mantiqiy eksklyuziv YOKI mos bitlarning har bir jufti ustida ishlash. Bitta bittadan bittasi 1 bo'lsa, har ikkala pozitsiyada natija 1 ga teng bo'ladi, lekin ikkalasi 0 bo'lsa yoki ikkalasi 1 bo'lsa 0 bo'ladi, bunda biz ikkita bitni taqqoslashni amalga oshiramiz, agar ikkala bit har xil bo'lsa 1 va 0 agar ular bir xil bo'lsa. Masalan:

    0101 (kasr 5) XOR 0011 (kasr 3) = 0110 (kasr 6)

Bit-bitli XOR registrda tanlangan bitlarni teskari aylantirish uchun ishlatilishi mumkin (ularni almashtirish yoki almashtirish ham deyiladi). Har qanday bitni XORing yordamida uni 1 bilan almashtirish mumkin. Masalan, 0010 bit naqshini hisobga olgan holda (kasr 2), ikkinchi va to'rtinchi bitlarni bit va ikkinchi va to'rtinchi pozitsiyalarda bit o'z ichiga olgan bit naqshli XOR bilan almashtirish mumkin:

    0010 (kasr 2) XOR 1010 (kasr 10) = 1000 (kasr 8)

Ushbu uslub mantiqiy holatlar to'plamini aks ettiruvchi bit naqshlarini boshqarish uchun ishlatilishi mumkin.

Assambleya tili dasturchilar va optimallashtirish kompilyatorlar ba'zan XOR-ni a qiymatini belgilash uchun qisqa tugma sifatida ishlating ro'yxatdan o'tish nolga. O'ziga qarshi qiymat bo'yicha XORni bajarish har doim nolga teng bo'ladi va ko'plab arxitekturalarda bu operatsiya nol qiymatini yuklash va uni registrga saqlashdan kamroq soat tsikllari va xotirani talab qiladi.

Agar belgilangan uzunlikdagi bit qatorlari to'plami bo'lsa n (ya'ni mashina so'zlari ) deb o'ylashadi n- o'lchovli vektor maydoni ustidan maydon , keyin vektor qo'shilishi bitli XORga to'g'ri keladi.

Matematik ekvivalentlar

Faraz qiling , manfiy bo'lmagan butun sonlar uchun bitli amallarni quyidagicha yozish mumkin:

Barcha ikkilik mantiqiy operatorlar uchun haqiqat jadvali

16 ta mumkin haqiqat vazifalari ikkitadan ikkilik o'zgaruvchilar; bu a ni belgilaydi haqiqat jadvali.

Ikkala P va Q bitlarning bitli ekvivalent operatsiyalari:

pqF0YO'Q1Xq2¬p34¬q5XOR6NAND7VA8XNOR9q10Agar / keyin11p12Keyin / agar13Yoki14T15
110000000011111111
100000111100001111
010011001100110011
000101010101010101
Bittadan
ekvivalentlar
0YO'Q
(p OR q)
(P emas)
VA q
YO'Q
p
p va
(Q emas)
YO'Q
q
p XOR qYO'Q
(p va q)
p va qYO'Q
(p XOR q)
q(P emas)
Yoki q
pp Yoki
(Q emas)
p OR q1

Bit siljishlar

The bit siljishlar ba'zida bitli operatsiyalar deb qaraladi, chunki ular qiymatni sonli miqdor sifatida emas, balki bitlar qatori sifatida ko'rib chiqadilar. Ushbu operatsiyalarda raqamlar ko'chiriladi yoki siljigan, chapga yoki o'ngga. Ro'yxatdan o'tish kitoblari kompyuter protsessorida belgilangan kenglik mavjud, shuning uchun ba'zi bitlar registrdan bir chetidan "siljiydi", ikkinchi uchidan esa xuddi shu sonli bitlar "siljiydi"; bitni almashtirish operatorlari o'rtasidagi farqlar ular ko'chirilgan bitlarning qiymatlarini qanday belgilashlariga bog'liq.

Bitli manzil

Agar registrning kengligi (ko'pincha 32 yoki hatto 64) eng kichik adreslanadigan birlik (atom elementi) bitlaridan (odatda 8) ko'p bo'lsa, tez-tez bayt deb ataladigan bo'lsa, almashtirish operatsiyalari bitlarda adreslash sxemasini keltirib chiqaradi. registrning ikkala uchidagi chegara effektlari, arifmetik va mantiqiy siljish operatsiyalari bir xil ishlaydi va 8 bitli pozitsiyalarga o'tish bit naqshini 1 bayt pozitsiyasiga quyidagi tarzda ko'chiradi:

chapga siljish 8 pozitsiyaga bayt manzilini 1 ga oshiradi
  • Kichik endian buyurtma:
8 pozitsiyaga o'ng siljish bayt manzilini 1 ga kamaytiradi
chapga siljish 8 pozitsiyaga bayt manzilini 1 ga kamaytiradi
  • Buyuk buyurtma:
8 pozitsiyaga o'ng siljish bayt manzilini 1 ga oshiradi

Arifmetik siljish

Chap arifmetik siljish
O'ng arifmetik siljish

In arifmetik siljish, ikkala uchidan siljigan bitlar tashlanadi. Chap arifmetik siljishda nollar o'ng tomonga siljiydi; o'ng arifmetik siljishda ishora bit (MSB ikkala qo'shimchada) chap tomonga siljiydi va shu bilan operand belgisini saqlab qoladi.

Ushbu misolda 8-bitli registr ishlatiladi:

   00010111 (kasr +23) LEFT-SHIFT = 00101110 (o‘nli raqam +46)
   10010111 (kasr -23) O'ngga-SHIFT = 11001011 (o‘nlik -11)

Birinchi holda, eng chap raqam registrning oxiridan o'tib, yangi 0 eng o'ng holatiga o'tkazildi. Ikkinchi holatda, eng o'ng tomon 1 ga almashtirildi (ehtimol bayroq ko'tarish ) va yangi raqam raqam belgisini saqlab, eng chap tomonga ko'chirildi. Ba'zan bir nechta smenali raqamlar soni bo'yicha bir smenaga qisqartiriladi. Masalan:

   00010111 (kasr +23) LEFT-SHIFT-BY-TWO = 01011100 (o‘nli +92)

Chap arifmetik siljish n 2 ga ko'paytirilishga tengn (qiymat bo'lmasa) toshib ketish ), o'ng arifmetik siljish esa n a ikkitasini to'ldiruvchi qiymat 2 ga bo'linishga tengn va salbiy cheksiz tomon yaxlitlash. Agar ikkilik raqam sifatida ko'rib chiqilsa bir-birini to'ldiruvchi, keyin xuddi shu o'ng smenali operatsiya 2 ga bo'linishga olib keladin va nolga yaxlitlash.

Mantiqiy siljish

Chap mantiqiy siljish
To'g'ri mantiqiy siljish

A mantiqiy siljish, tashlangan bitlarni almashtirish uchun nollar siljiydi. Shuning uchun mantiqiy va arifmetik chap siljishlar aynan bir xil.

Biroq, mantiqiy o'ng siljish 0 bitni eng muhim bitga qo'shganligi sababli, belgi bitini nusxalash o'rniga, imzosiz ikkilik raqamlar uchun, arifmetik o'ng siljish esa imzolangan uchun juda mos keladi ikkitasini to'ldiruvchi ikkilik raqamlar.

Dumaloq siljish

Shiftning yana bir shakli bu dumaloq siljish, bitli aylanish yoki bitning aylanishi.

Aylantirish

Chap dumaloq siljish yoki aylantirish
O'ng dumaloq siljish yoki aylantirish

Ushbu operatsiyada ba'zan chaqiriladi transport vositasini aylantirmang, bitlar registrning chap va o'ng uchlari birlashtirilgandek "aylantiriladi". Chapga siljish paytida o'ng tomonga siljigan qiymat chap tomonga siljigan har qanday qiymatga va aksincha o'ngga siljish uchun. Agar mavjud bo'lgan barcha bitlarni saqlab qolish zarur bo'lsa va raqamli raqamlarda tez-tez ishlatilsa, bu foydali bo'ladi kriptografiya.[tushuntirish kerak ]

Yuk ko'tarish orqali aylantiring

Chapni tashish orqali aylantirish
Yuk ko'tarish orqali o'ng tomonga buriling

Yuk ko'tarish orqali aylantiring aylantirish operatsiyasining bir variantidir, bu erda (ikkala uchida) siljigan bit ko'chirish bayrog'ining eski qiymati, va (boshqa uchida) ko'chirilgan bit ko'chirish bayrog'ining yangi qiymatiga aylanadi .

Bitta ko'chirish orqali aylantiring oldindan ko'chirish bayrog'ini o'rnatib, bitta pozitsiyaning mantiqiy yoki arifmetik siljishini simulyatsiya qilishi mumkin. Masalan, agar bayroqda 0 bo'lsa, u holda x BIR-BIRGA TAShKIL ETISh UChUN ROTATSIYA bu mantiqiy o'ng siljishdir va agar ko'chirish bayrog'ida belgi bitining nusxasi bo'lsa, unda x BIR-BIRGA TAShKIL ETISh UChUN ROTATSIYA arifmetik o'ng siljish. Shu sababli, past uchi kabi ba'zi bir mikrokontroller Rasmlar faqat bor aylantirmoq va ko'chirish orqali aylantiring, va arifmetik yoki mantiqiy siljish bo'yicha ko'rsatmalar bilan bezovta qilmang.

Ko'chirish orqali aylantirish, ayniqsa, protsessor mahalliyidan kattaroq raqamlarda siljishlarni amalga oshirishda foydalidir so'z hajmi, chunki agar ikkita registrda katta son saqlangan bo'lsa, birinchi registrning bir uchidan siljigan bit ikkinchisining ikkinchi uchiga tushishi kerak. O'tkazish orqali aylantirish paytida ushbu bit birinchi smenada ko'chirish bayrog'ida "saqlanib qoladi" va ikkinchi smenada hech qanday qo'shimcha tayyorgarliksiz o'tishga tayyor bo'ladi.

Yuqori darajadagi tillarda

C-oila

Yilda C-oila mantiqiy almashtirish operatorlari "<<"chap smenada va">>"o'ng siljish uchun. Ko'chirish joylari soni operatorga ikkinchi argument sifatida berilgan. Masalan,

x = y << 2;

tayinlaydi x siljish natijasi y chap tomonda ikkita bit, bu to'rtga ko'paytirilishga teng.

Shiftlar dastur tomonidan belgilangan xatti-harakatga olib kelishi yoki aniqlanmagan xatti-harakatlar, shuning uchun ulardan foydalanishda ehtiyot bo'lish kerak. So'zning kattaligidan kattaroq yoki kattaroq bit sonini almashtirish natijasi C va C ++ da aniqlanmagan xatti-harakatlardir.[2][3] Salbiy qiymatni o'ng tomonga siljitish dastur tomonidan belgilanadi va yaxshi kodlash amaliyoti tomonidan tavsiya etilmaydi;[4] agar natijani natija turida ifodalash mumkin bo'lmasa, imzolangan qiymatni chapga siljitish natijasi aniqlanmagan.[2]

C # da, birinchi operand int yoki uzun bo'lsa, o'ng siljish arifmetik siljishdir. Agar birinchi operand uint yoki ulong turida bo'lsa, o'ngga siljish mantiqiy siljishdir.[5]

Dumaloq siljishlar

Tillarning C oilasida rotatsiya operatori yo'q, ammo uni smena operatorlaridan sintez qilish mumkin. Qochmaslik uchun bayonot yaxshi shakllanganligini ta'minlash uchun ehtiyot bo'lish kerak aniqlanmagan xatti-harakatlar va hujumlarni vaqtini belgilash xavfsizlik talablariga ega dasturiy ta'minotda.[6] Masalan, qoldirilgan sodda dastur 32-bit imzosiz qiymatni aylantiradi x tomonidan n lavozimlar shunchaki:

uint32_t x = ..., n = ...;uint32_t y = (x << n) | (x >> (32 - n));

Biroq, siljish 0 bitlar o'ng tomon ifodasida noaniq harakatlarga olib keladi (x >> (32 - n)) chunki 32 - 0 bu 32va 32 doiradan tashqarida [0 - 31] shu jumladan. Ikkinchi urinish quyidagilarga olib kelishi mumkin:

uint32_t x = ..., n = ...;uint32_t y = n ? (x << n) | (x >> (32 - n)) : x;

bu erda smena miqdori aniqlanmagan xatti-harakatni keltirib chiqarmasligini ta'minlash uchun sinovdan o'tkaziladi. Biroq, filial qo'shimcha kod yo'lini qo'shadi va vaqtni tahlil qilish va hujum qilish uchun imkoniyat yaratadi, bu yuqori darajadagi dasturiy ta'minotda ko'pincha qabul qilinmaydi.[6] Bundan tashqari, kod bir nechta mashinalar ko'rsatmalariga kompilyatsiya qilinadi, bu ko'pincha protsessorning mahalliy ko'rsatmalariga qaraganda samarasiz.

GCC va Clang ostida aniqlanmagan xatti-harakatlar va filiallardan qochish uchun quyidagilar tavsiya etiladi. Naqsh ko'plab kompilyatorlar tomonidan tan olinadi va kompilyator bitta aylantirish buyrug'ini chiqaradi:[7][8][9]

uint32_t x = ..., n = ...;uint32_t y = (x << n) | (x >> (-n & 31));

Shuningdek, kompilyatorga xos xususiyatlar mavjud ichki amalga oshirish dumaloq siljishlar, kabi _rotl8, _rotl16, _rotr8, _rotr16 Microsoft-da Visual C ++. Clang yuqoridagi muammolarga duch keladigan Microsoft-ning muvofiqligi uchun ba'zi bir ichki ichki xususiyatlarni taqdim etadi.[9] GCC rotatsion ichki mahsulotlarni taklif qilmaydi. Intel shuningdek x86-ni taqdim etadi Ichki narsalar.

Java

Yilda Java, barcha tamsayı turlari imzolangan, shuning uchun "<<"va">>"operatorlar arifmetik almashtirishlarni amalga oshiradilar. Java operatorni qo'shadi">>>"mantiqiy o'ng siljishlarni amalga oshirish uchun, lekin chapga siljish mantiqiy va arifmetik amallar imzolangan tamsayı uchun bir xil bo'lgani uchun, yo'q"<<<"operatori Java.

Java shift operatorlari haqida batafsil ma'lumot:[10]

  • Operatorlar << (chap smena), >> (imzolangan o'ng smenada) va >>> (imzosiz o'ng siljish) smena operatorlari.
  • Shift ifodasining turi - chap operandning ko'tarilgan turi. Masalan, aBayt >>> 2 ga teng ((int) bayt) >>> 2.
  • Agar chap operandning ko'tarilgan turi int bo'lsa, siljish masofasi sifatida faqat o'ng operandning beshta eng past tartibli biti ishlatiladi. Go'yo o'ng operand 0x1f (0b11111) niqob qiymatiga ega bo'lgan mantiqiy AND operatoriga ta'sir qilgandek.[11] Shuning uchun amalda ishlatiladigan siljish masofasi har doim 0 dan 31 gacha, shu jumladan.
  • Agar chap tomondagi operandning ilgari surilgan turi uzun bo'lsa, u holda siljish masofasi sifatida faqat o'ng operandning oltita eng past tartibli bitlaridan foydalaniladi. Go'yo o'ng operand 0x3f (0b111111) niqobli qiymatiga ega bo'lgan mantiqiy AND operatoriga bo'ysundirilgandek.[11] Shuning uchun amalda ishlatiladigan siljish masofasi har doim 0 dan 63 gacha, shu jumladan.
  • Ning qiymati n >>> s bu n o'ngga siljigan s nol kengaytmali bitli pozitsiyalar.
  • Bit va smenali operatsiyalarda turi bayt bilvosita aylantiriladi int. Agar bayt qiymati manfiy bo'lsa, eng yuqori bit bittaga teng bo'lsa, unda qo'shimcha baytlarni to'ldirishda ishlatiladi. Shunday qilib bayt b1 = -5; int men = b1 | 0x0200; olib keladi i == -5.

JavaScript

JavaScript ikkitasini yoki ikkitasini har birini baholash uchun bitli operatsiyalardan foydalanadi birliklar joy 1 yoki 0 ga.[12]

Paskal

Paskalda, shuningdek uning barcha shevalarida (masalan.) Ob'ekt Paskal va Standart Paskal ), mantiqiy chap va o'ng siljish operatorlari "shl"va"shr"mos ravishda. Hatto imzolangan tamsayılar uchun ham shr mantiqiy siljish kabi harakat qiladi va belgi bitini nusxa ko'chirmaydi. Ko'chirish uchun joylar soni ikkinchi dalil sifatida berilgan. Masalan, quyidagi tayinlaydi x siljish natijasi y chapga ikki bit:

x := y shl 2;

Boshqalar

Ilovalar

Bit-bitli operatsiyalar, ayniqsa, qurilma drayverlari, past darajadagi grafikalar, aloqa protokoli paketlarini yig'ish va dekodlash kabi quyi darajadagi dasturlashda zarurdir.

Garchi mashinalarda ko'pincha arifmetik va mantiqiy operatsiyalarni bajarish uchun samarali o'rnatilgan ko'rsatmalar mavjud bo'lsa ham, bu operatsiyalarning hammasi bitli operatorlarni birlashtirish va turli usullar bilan nol-sinov orqali amalga oshirilishi mumkin.[13] Masalan, bu erda psevdokod amalga oshirish qadimgi Misrni ko'paytirish ikkita ixtiyoriy butun sonni qanday ko'paytirishni ko'rsatib beradi a va b (a dan katta b) faqat bitshift va qo'shimchalar yordamida:

v  0esa b  0    agar (b va 1)  0        v  v + a    chap siljish a tomonidan 1    to'g'ri siljish b tomonidan 1qaytish v

Yana bir misol, ikkita butun sonning yig'indisini qanday hisoblashni ko'rsatadigan qo'shimchani psevdokod yordamida amalga oshirish a va b bitli operatorlar va nol-test yordamida:

esa a  0    v  b va a    b  b xor a    chap siljish v tomonidan 1    a  vqaytish b

Mantiqiy algebra

Ba'zan bitli operatsiyalardan tashkil topgan murakkab iboralarni soddalashtirish foydalidir. Masalan, kompilyatorlarni yozishda. Kompilyatorning maqsadi a ni tarjima qilishdir yuqori darajadagi dasturlash tili eng samarali mashina kodi mumkin. Mantiqiy algebra murakkab bitli ifodalarni soddalashtirish uchun ishlatiladi.

VA

  • x & y = y & x
  • x & (y & z) = (x & y) & z
  • x & 0xFFFF = x[14]
  • x & 0 = 0
  • x & x = x

Yoki

  • x | y = y | x
  • x | (y | z) = (x | y) | z
  • x | 0 = x
  • x | 0xFFFF = 0xFFFF
  • x | x = x

YO'Q

  • ~ (~ x) = x

XOR

  • x ^ y = y ^ x
  • x ^ (y ^ z) = (x ^ y) ^ z
  • x ^ 0 = x
  • x ^ y ^ y = x
  • x ^ x = 0
  • x ^ 0xFFFF = ~ x

Bundan tashqari, XOR uchta asosiy operatsiya yordamida tuzilishi mumkin (AND, OR, NOT)

  • a ^ b = (a | b) & (~ a | ~ b)
  • a ^ b = (a & ~ b) | (~ a & b)

Boshqalar

  • x | (x & y) = x
  • x & (x | y) = x
  • ~ (x | y) = ~ x & ~ y
  • ~ (x & y) = ~ x | ~ y
  • x | (y & z) = (x | y) & (x | z)
  • x & (y | z) = (x & y) | (x & z)
  • x & (y ^ z) = (x & y) ^ (x & z)
  • x + y = (x ^ y) + ((x & y) << 1)
  • x - y = ~ (~ x + y)

Teskari tomonlar va tenglamalarni echish

Mantiqiy algebradagi o'zgaruvchilarni echish qiyin bo'lishi mumkin, chunki oddiy algebradan farqli o'laroq, bir nechta operatsiyalarda teskari ko'rsatkichlar mavjud emas. Inversiz operatsiyalar bajarilayotganda asl ma'lumotlarning bir qismini yo'qotadi va bu etishmayotgan ma'lumotlarni qayta tiklashning iloji yo'q.

  • Teskari bor
    • YO'Q
    • XOR
    • Chapga burish
    • O'ngga aylantiring
  • Teskari emas
    • VA
    • Yoki
    • Chapga siljish
    • O'ngga siljitish

Amaliyotlar tartibi

Ushbu ro'yxatning yuqori qismidagi operatsiyalar birinchi navbatda bajariladi. To'liq ro'yxat uchun asosiy maqolani ko'ring.

Shuningdek qarang

Adabiyotlar

  1. ^ "CMicrotek kam quvvatli dizayn blogi". CMicrotek. Olingan 2015-08-12.
  2. ^ a b JTC1 / SC22 / WG14 N843 "C dasturlash tili", 6.5.7-bo'lim
  3. ^ "Arifmetik operatorlar - cppreference.com". en.cppreference.com. Olingan 2016-07-06.
  4. ^ "INT13-C. Bit bitli operatorlardan faqat imzosiz operandlarda foydalaning". CERT: xavfsiz kodlash standartlari. Dasturiy ta'minot muhandisligi instituti, Karnegi Mellon universiteti. Olingan 2015-09-07.
  5. ^ "Operator (C # ma'lumotnomasi)". Microsoft. Olingan 2013-07-14.
  6. ^ a b "Doimiy vaqtni aylantirish standartlarni buzmaydigan holatga keladimi?". Stack Exchange Network. Olingan 2015-08-12.
  7. ^ "Portativ rotatsiya iborasini yomon optimallashtirish". GNU GCC loyihasi. Olingan 2015-08-11.
  8. ^ "C / C ++ standartiga zid bo'lmagan aylana aylanadimi?". Intel dasturchilar forumlari. Olingan 2015-08-12.
  9. ^ a b "Doimiy qatorda yig'ilishda tarqalmaydi, natijada" I "cheklovi butun sonli doimiy ifodani kutadi" ". LLVM loyihasi. Olingan 2015-08-11.
  10. ^ Java tilining spetsifikatsiyasi, bo'lim 15.19. Shift operatorlari
  11. ^ a b "15-bob. Ifodalar". oracle.com.
  12. ^ "JavaScript bitwise". W3Schools.com.
  13. ^ "Bit-siljish fokuslari yordamida arifmetik amallarni sintez qilish". Bisqwit.iki.fi. 2014-02-15. Olingan 2014-03-08.
  14. ^ Ushbu maqola davomida 0xFFFF sizning ma'lumotlar turingizdagi barcha bitlarni 1 ga o'rnatish kerakligini anglatadi. Bitlarning aniq soni ma'lumotlar turining kengligiga bog'liq.
  15. ^ - bu bu inkor, ayirish emas
  16. ^ - bu inkor emas, ayirish

Tashqi havolalar