C bitli operatorlar
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
| Operator | Nomi | Tavsif |
|---|---|---|
| & | 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 |
| ^ | XOR | Bitlardan faqat bittasi 1 bo‘lsa, har bir bitni 1 ga o‘rnatadi |
| ~ | EMAS (NOT) | Barcha bitlarni teskarisiga o‘zgartiradi |
| << | Chapga siljitish | Bitlarni chapga siljitadi (2 ning darajalariga ko‘paytiradi) |
| >> | O‘ngga siljitish | Bitlarni 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:
| Amal | Ikkilik natija | O‘nlik natija |
|---|---|---|
| a & b | 0010 | 2 |
| a | b | 0111 | 7 |
| a ^ b | 0101 | 5 |
| ~a | ...1001 | -7 (ko‘pchilik tizimlarda) |
| a << 1 | 1100 | 12 |
| a >> 1 | 0011 | 3 |
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)
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)
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)
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
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‘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)
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");
}
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!
