побитовото Operaторове в C: И, ИЛИ, XOR, Shift & Допълване

⚡ Умно обобщение

Битовите оператори в C манипулират данни на ниво отделен бит, използвайки AND, OR, XOR, операции за допълване и изместване върху целочислени операнди, за да извършват по-бързи изчисления, да пакетират флагове и да контролират хардуера в ниско ниво и вградено програмиране.

  • 🧮 Operaторове: Шест оператора — AND (&), OR (|), XOR (^), complement (~), ляво изместване (<<), дясно изместване (>>) — действат бит по бит.
  • 🔗 И & ИЛИ: Резултатът от & е ​​1 само когато и двата бита са 1; | е 1, когато някой от битовете е 1.
  • 🔀 Изключващо ИЛИ: Резултатът от ^ е 1, когато точно един бит е 1, което е удобно за превключване на битове и размяна.ping стойности.
  • ↔️ Shifts: Операторите << и >> преместват битовете наляво или надясно, умножавайки или делейки на степени на две.
  • 🔁 Допълнение: Операторът ~ обръща всеки бит, така че 0000 1111 става 1111 0000.
  • 🤖 Помощ с изкуствен интелект: AI асистентите и GitHub Copilot генерират и обясняват бързо битовата маска и логиката на изместване.

побитовото Operaтори в C

Какво представляват побитовите Operaторове?

побитовото OperaПрограмите се използват за манипулиране на данни на битово ниво, наричано още програмиране на битово ниво. Побитовото програмиране работи с един или повече битови шаблони или двоични числа на ниво техните отделни битове. Те се използват в числените изчисления, за да ускорят процеса на изчисление.

Следва списъкът с побитови оператори, осигурен от езика за програмиране C:

OperaTor Значение
& Побитово И оператор
| Побитов оператор ИЛИ
^ Побитово изключителен оператор ИЛИ
~ Допълнение към двоично единица Operator е унарен оператор
<< Оператор на лява смяна
>> Оператор на дясна смяна

Побитовите оператори не могат да се прилагат директно към примитивни типове данни като float, double и др. Винаги помнете едно нещо, че побитовите оператори се използват най-вече с тип данни цяло число поради неговата съвместимост.

Побитовите логически оператори работят върху данните бит по бит, започвайки от най-малкия бит, т.е. LSB бит, който е най-десният бит, работейки към MSB (Most Significant Bit), който е най-левият бит.

Резултатът от изчислението на побитовите логически оператори е показан в таблицата по-долу.

x y x & y x | г x ^ y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

Побитово И

Това е един от най-често използваните логически битови оператори. Той е представен с един знак амперсанд (&). Два целочислени израза са записани от всяка страна на оператора (&).
Резултатът от побитовата операция И е 1, ако и двата бита имат стойност като 1; в противен случай резултатът винаги е 0.

Нека приемем, че имаме 2 променливи op1 и op2 със следните стойности:

Op1 = 0000 1101
Op2 = 0001 1001

Резултатът от операцията И върху променливи op1 и op2 ще бъде

Result = 0000 1001

Както виждаме, две променливи се сравняват малко по малко. Всеки път, когато стойността на бит и в двете променливи е 1, тогава резултатът ще бъде 1 или в противен случай 0.

Побитово ИЛИ

Той е представен от един знак с вертикална лента (|). Два целочислени израза са записани от всяка страна на оператора (|).

Резултатът от побитовата операция ИЛИ е 1, ако поне един от изразите има стойност като 1; в противен случай резултатът винаги е 0.

Нека приемем, че имаме 2 променливи op1 и op2 със следните стойности:

Op1 = 0000 1101
Op2 = 0001 1001

Резултатът от операцията ИЛИ върху променливи op1 и op2 ще бъде

Result = 0001 1101

Както виждаме, две променливи се сравняват малко по малко. Когато стойността на бит в една от променливите е 1, резултатът ще бъде 1 или 0.

Побитово изключително ИЛИ

Той е представен със символ (^). Два целочислени израза са записани от всяка страна на оператора (^).

Резултатът от побитовата операция Изключително ИЛИ е 1, ако само един от изразите има стойност като 1; в противен случай резултатът винаги е 0.

Нека приемем, че имаме 2 променливи op1 и op2 със следните стойности:

Op1 = 0000 1101
Op2 = 0001 1001

Резултатът от операцията XOR върху променливи op1 и op2 ще бъде

Result = 0001 0100

Както виждаме, две променливи се сравняват малко по малко. Когато само една променлива съдържа стойност 1, тогава резултатът е 0, в противен случай резултатът ще бъде 0.

Нека напишем проста програма, която демонстрира побитови логически оператори.

#include <stdio.h>
int main() 
{
int a = 20;	/* 20 = 010100 */  
int b = 21;	/* 21 = 010101 */
int c = 0;           

c = a & b;       /* 20 = 010100 */ 
printf("AND - Value of c is %d\n", c );

c = a | b;       /* 21 = 010101 */
printf("OR - Value of c is %d\n", c );

c = a ^ b;       /* 1 = 0001 */
printf("Exclusive-OR - Value of c is %d\n", c );

getch();
}

Изход:

AND - Value of c is 20
OR - Value of c is 21
Exclusive-OR - Value of c is 1

Оператори за побитово преместване

Операторите за побитово изместване се използват за преместване/изместване на битовите шаблони наляво или надясно. „Left“ и „Right“ са два оператора за изместване, предоставени от „C“, които са представени по следния начин:

Operand << n (Left Shift)
Operand >> n (Right Shift)

Тук

  • операндът е цяло числов израз, върху който трябва да извършим операцията смяна.
  • 'n' е общият брой битови позиции, които трябва да изместим в израза за цяло число.

Операцията за ляво изместване ще измести 'n' броя битове наляво. Най-левите битове в израза ще бъдат извадени и n бита със стойност 0 ще бъдат запълнени от дясната страна.

Операцията за изместване надясно ще измести броя на 'n' бита вдясно. Най-десните 'n' бита в израза ще бъдат извадени и стойността 0 ще бъде запълнена от лявата страна.

Пример: x е цяло число с данни 1111. След извършване на операция за смяна резултатът ще бъде:

x << 2 (left shift) = 1111<<2 = 1100
x>>2 (right shift) = 1111>>2 = 0011

Shifts операторите могат да се комбинират, след което могат да се използват за extracданните от целочисления израз. Нека напишем програма, която да демонстрира използването на оператори за побитово изместване.

#include <stdio.h>
int main() {
int a = 20;	/* 20 = 010100 */  
int c = 0;           

c = a << 2;	/* 80 = 101000 */
printf("Left shift - Value of c is %d\n", c );

c = a >> 2;	/*05 = 000101 */
printf("Right shift - Value of c is %d\n", c );
return 0;
}

Изход:

Left shift - Value of c is 80
Right shift - Value of c is 5

След извършване на ляво изместване стойността ще стане 80, чийто двоичен еквивалент е 101000.

След извършване на операцията за надясно преместване, стойността ще стане 5, чийто двоичен еквивалент е 000101.

Оператор за побитово допълнение

Побитовото допълнение се нарича също като оператор на едно допълнение, тъй като винаги приема само една стойност или операнд. Това е унарен оператор.

Когато извършим допълване на всеки бит, всички 1 стават 0 и обратно.

Ако имаме целочислен израз, който съдържа 0000 1111, тогава след извършване на операция за побитово допълване стойността ще стане 1111 0000.

Операторът на побитово допълнение се обозначава със символ тилда (~).

Нека напишем програма, която демонстрира прилагането на оператор за побитово допълнение.

#include <stdio.h>
int main() {
int a = 10;	/* 10 = 1010 */  
int c = 0;           
c = ~(a);      
printf("Complement - Value of c is %d\n", c );
return 0;
}

Изход:

Complement - Value of c is -11

Ето още една програма с пример за всички оператори, обсъдени досега:

#include <stdio.h>
main() {
unsigned int x = 48;	/* 48 = 0011 0000 */  
unsigned int y = 13;	/* 13 = 0000 1101 */
int z = 0;           

z =x & y;       /* 0 = 0000 0000 */ 
printf("Bitwise AND Operator - x & y = %d\n", z );

z = x | y;       /* 61 = 0011 1101 */
printf("Bitwise OR Operator - x | y = %d\n", z );

z= x^y;       /* 61 = 0011 1101 */
printf("Bitwise XOR Operator- x^y= %d\n", z);

z = ~x;          /*-49 = 11001111 */
printf("Bitwise One's Complement Operator - ~x = %d\n", z);

z = x << 2;     /* 192 = 1100 0000 */
printf("Bitwise Left Shift Operator x << 2= %d\n", z );

z= x >> 2;     /* 12 = 0000 1100 */
printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}

След като компилираме и стартираме програмата, тя дава следния резултат:

Bitwise AND Operator - x & y = 0
Bitwise OR Operator - x | y = 61
Bitwise XOR Operator- x^y= 61
Bitwise One's Complement Operator - ~x = -49
Bitwise Left Shift Operator x << 2= 192
Bitwise Right Shift Operator x >> 2= 12

Въпроси и Отговори

Побитовото И (&) оперира с отделни битове и връща цяло число, докато логическото И (&&) проверява цели изрази и връща единична булева стойност „true“ или „false“.

Shift 1 за създаване на маска: задаване със стойност | (1 << n), изчистване със стойност & ~(1 << n) и превключване със стойност ^ (1 << n).

Лявото отместване с n умножава беззнакова стойност по 2, повдигнато на степен n; дясното отместване дели на него, така че компилаторите използват отмествания за по-бърза обработка.

Проверете числото и 1. Най-ниският бит връща 1 за нечетни стойности и 0 за четни стойности, по-бързо от оператора по модул.

Вграденият фърмуер, драйверите, криптографията, компресията, графиката и мрежите ги използват за пакетиране на флагове, четене на хардуерни регистри, изграждане на маски за разрешения и ускоряване на аритметиката.

Shift Операторите се свързват по-силно от релационните, докато &, ^ и | са под равенството, но над логическите && и ||, така че за по-сигурно ги оградете в скоби.

Да. Асистент по кодиране с изкуствен интелект пише маски и сменяния от подкана, обяснява отрицателните допълнения и превръща двоични примери в работещ код на C. Винаги тествайте резултата.

Копилот на GitHub предлага макроси за битови маски, помощни инструменти за задаване и изчистване на битове и математически операции за отместване от коментар; прегледайте завършванията му спрямо вашата битова подредба.

Обобщете тази публикация с: