C bitli operatorlar


ULASHISH

C bitli operatorlar

Eslatma: Bu C tilidagi ancha murakkab mavzu. Agar dasturlashda yangi bo‘lsangiz va u avvaliga qiyin tuyulsa, xavotir olmang - bitli operatorlar asosan tizimli dasturlash, apparatni boshqarish yoki unumdorlikni optimallashtirish kabi maxsus hollarda qo‘llaniladi.

C tilida bitli operatorlar sonlarni ikkilik shaklda tashkil etuvchi bitlar (1 va 0 lar) bilan bevosita ishlash imkonini beradi.

Kompyuterdagi har bir butun son ikkilik shaklda saqlanadi, ya’ni u 0 yoki 1 bo‘lgan bitlar (ikkilik raqamlar) yordamida ifodalanadi. Bitli operatorlar bu bitlarni solishtirish, birlashtirish, siljitish yoki teskarisiga o‘zgartirish imkonini beradi.

Eslatma: Bitli amallar faqat butun son tiplari (masalan, int, char yoki long) bilan ishlaydi.

Maslahat: Agar ikkilik sonlar bilan hali tanish bo‘lmasangiz, avval quyidagi sahifalarni ko‘rib chiqing:


Bitli operatorlar ro‘yxati

OperatorNomiTavsif
&VA (AND)Ikkala bit ham 1 bo‘lsa, har bir bitni 1 ga o‘rnatadi
|YOKI (OR)Bitlardan kamida bittasi 1 bo‘lsa, har bir bitni 1 ga o‘rnatadi
^XORBitlardan faqat bittasi 1 bo‘lsa, har bir bitni 1 ga o‘rnatadi
~EMAS (NOT)Barcha bitlarni teskarisiga o‘zgartiradi
<<Chapga siljitishBitlarni chapga siljitadi (2 ning darajalariga ko‘paytiradi)
>>O‘ngga siljitishBitlarni o‘ngga siljitadi (2 ning darajalariga bo‘ladi)

Ikkilik misol

Ikkita butun sondan boshlaylik:

int a = 6;  // 0110 in binary
int b = 3;  // 0011 in binary

Turli bitli operatorlar bu qiymatlar ustida qanday ishlashi quyida ko‘rsatilgan:

AmalIkkilik natijaO‘nlik natija
a & b00102
a | b01117
a ^ b01015
~a...1001-7 (ko‘pchilik tizimlarda)
a << 1110012
a >> 100113


O‘nlik va ikkilik qiymatlar

Quyida o‘nlik sonlar ikkilik shaklda (16 bitli formatda) qanday ko‘rinishini ko‘rsatuvchi kichik ma’lumotnoma jadvali keltirilgan:

 0 = 0000000000000000
 1 = 0000000000000001
 2 = 0000000000000010
 3 = 0000000000000011
 4 = 0000000000000100
 5 = 0000000000000101
 6 = 0000000000000110
 7 = 0000000000000111
 8 = 0000000000001000
 9 = 0000000000001001
10 = 0000000000001010
11 = 0000000000001011
12 = 0000000000001100

Maslahat: Chapga har bir qadam qiymatni ikki barobar oshiradi. Masalan, 0000000000000100 4 ga teng, chunki o‘ngdan uchinchi bit o‘rnatilgan (22 = 4).


Bitli AND (&)

& operatori har bir bitni solishtiradi va faqat ikkala bit ham 1 bo‘lgandagina 1 qaytaradi.

Misol

int a = 6;   // 0110
int b = 3;   // 0011

int result = a & b;
printf("Result: %d\n", result); // 2 (0010)

O‘zingiz sinab ko‘ring »


Bitli OR (|)

| operatori bitlardan istalgan biri 1 bo‘lsa, bitni 1 ga o‘rnatadi.

Misol

int a = 6;   // 0110
int b = 3;   // 0011

int result = a | b;
printf("Result: %d\n", result); // 7 (0111)

O‘zingiz sinab ko‘ring »


Bitli XOR (^)

^ operatori faqat bitlar har xil bo‘lgandagina 1 qaytaradi.

Misol

int a = 6;   // 0110
int b = 3;   // 0011

int result = a ^ b;
printf("Result: %d\n", result); // 5 (0101)

O‘zingiz sinab ko‘ring »


Bitli NOT (~)

~ operatori har bir bitni teskarisiga o‘zgartiradi (0 1 ga, 1 esa 0 ga aylanadi).

Misol

int a = 5; // 00000101

int result = ~a;
printf("Result: %d\n", result); // -6 on most systems

O‘zingiz sinab ko‘ring »

Eslatma: ~ natijasi manfiy sonlar qanday saqlanishiga bog‘liq (odatda qo‘shimcha kod, ya’ni two’s complement usulida). Masalan, 5 (00000101) 11111010 ga aylanadi va u -6 sifatida talqin qilinadi.


Chapga siljitish (<<)

<< operatori bitlarni chapga siljitadi va o‘ng tomonni 0 lar bilan to‘ldiradi. Bu 2 ning darajalariga ko‘paytirish bilan bir xil.

Misol

int a = 3; // 00000011

int result = a << 2;
printf("Result: %d\n", result); // 12 (3 * 2^2)

O‘zingiz sinab ko‘ring »


O‘ngga siljitish (>>)

>> operatori bitlarni o‘ngga siljitadi. Bu 2 ning darajalariga bo‘lish bilan bir xil. Ishorali butun sonlarda tizimga qarab ishora biti saqlanib qolishi mumkin.

Misol

int a = 12; // 00001100

int result = a >> 2;
printf("Result: %d\n", result); // 3 (12 / 2^2)

O‘zingiz sinab ko‘ring »


Hayotiy misol: bayroqlar va ruxsatlar

Bitli operatorlar ko‘pincha bayroqlar (flags) yordamida bitta butun sonda bir nechta parametrni saqlash uchun ishlatiladi.

Misol

#define READ  1  // 0001
#define WRITE 2  // 0010
#define EXEC  4  // 0100

int permissions = READ | WRITE;  // user can read and write

if (permissions & READ) {
  printf("Read allowed\n");
}
if (permissions & WRITE) {
  printf("Write allowed\n");
}
if (permissions & EXEC) {
  printf("Execute allowed\n");
}

O‘zingiz sinab ko‘ring »

Bu misolda foydalanuvchida READ va WRITE ruxsatlari bor, lekin EXEC ruxsati yo‘q.


Xulosa

  • Bitli operatorlar butun sonlarning alohida bitlari ustida ishlaydi
  • &: AND - ikkala bit ham 1 bo‘lishi kerak
  • |: OR - bitlardan istalgan biri 1 bo‘lishi mumkin
  • ^: XOR - faqat bitta bit 1 ga teng
  • ~: NOT - barcha bitlarni teskarisiga o‘zgartiradi
  • <<: chapga siljitish - 2 ning darajalariga ko‘paytiradi
  • >>: o‘ngga siljitish - 2 ning darajalariga bo‘ladi

Maslahat: Bitli amallar optimallashtirish, apparatga past darajada murojaat qilish, bayroqlar va maskalar uchun foydali.



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!