Bit a bit Operatores em C: AND, OR, XOR, Shift & Complemento

โšก Resumo Inteligente

Em C, os operadores bit a bit manipulam dados em nรญvel de bit individual, usando operaรงรตes AND, OR, XOR, complemento e deslocamento em operandos inteiros para realizar cรกlculos mais rรกpidos, armazenar flags e controlar hardware em programaรงรฃo de baixo nรญvel e sistemas embarcados.

  • ๐Ÿงฎ Operatores: Seis operadores โ€” AND (&), OR (|), XOR (^), complemento (~), deslocamento ร  esquerda (<<), deslocamento ร  direita (>>) โ€” atuam bit a bit.
  • ๐Ÿ”— E & OU: O operador & resulta em 1 somente quando ambos os bits sรฃo 1; o operador | resulta em 1 quando qualquer um dos bits รฉ 1.
  • ๐Ÿ”€ XOR: O resultado ^ รฉ 1 quando exatamente um bit รฉ 1, รบtil para alternar bits e realizar trocas.ping valores.
  • โ†”๏ธ Shifts: Os operadores << e >> deslocam bits para a esquerda ou para a direita, multiplicando ou dividindo por potรชncias de dois.
  • ๐Ÿ” Complemento: O operador ~ inverte todos os bits, entรฃo 0000 1111 se torna 1111 0000.
  • ๐Ÿค– Ajuda da IA: Assistentes de IA e o GitHub Copilot geram e explicam rapidamente a lรณgica de mรกscara de bits e deslocamento.

Bit a bit Operatores em C

O que sรฃo Bitwise Operatores?

Bit a bit OperaOs operadores bit a bit sรฃo usados โ€‹โ€‹para manipular dados em nรญvel de bits, tambรฉm chamado de programaรงรฃo em nรญvel de bits. Eles operam em um ou mais padrรตes de bits ou numerais binรกrios no nรญvel de seus bits individuais. Sรฃo usados โ€‹โ€‹em cรกlculos numรฉricos para tornar o processo de computaรงรฃo mais rรกpido.

A seguir estรก a lista de operadores bit a bit fornecidos pela linguagem de programaรงรฃo 'C':

Operator Significado
& Operador AND bit a bit
| Operador OR bit a bit
^ Operador OR exclusivo bit a bit
~ Complemento de Binรกrio Operator รฉ um operador unรกrio
<< Operador de turno ร  esquerda
>> Operador de deslocamento para a direita

Operadores bit a bit nรฃo podem ser aplicados diretamente a tipos de dados primitivos como float, double, etc. Lembre-se sempre de que os operadores bit a bit sรฃo usados โ€‹โ€‹principalmente com... tipo de dados inteiro devido ร  sua compatibilidade.

Os operadores lรณgicos bit a bit trabalham nos dados bit a bit, comeรงando pelo bit menos significativo, ou seja, o bit LSB que รฉ o bit mais ร  direita, trabalhando em direรงรฃo ao MSB (Most Significant Bit) que รฉ o bit mais ร  esquerda.

O resultado do cรกlculo dos operadores lรณgicos bit a bit รฉ mostrado na tabela abaixo.

x y x e y x | lรก x^y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

AND bit a bit

Este รฉ um dos operadores lรณgicos bit a bit mais comumente usados. Ele รฉ representado por um รบnico sinal de E comercial (&). Duas expressรตes inteiras sรฃo escritas em cada lado do operador (&).
O resultado da operaรงรฃo AND bit a bit รฉ 1 se ambos os bits tiverem o valor 1; caso contrรกrio, o resultado serรก sempre 0.

Vamos considerar que temos 2 variรกveis โ€‹โ€‹op1 e op2 com valores como segue:

Op1 = 0000 1101
Op2 = 0001 1001

O resultado da operaรงรฃo AND nas variรกveis โ€‹โ€‹op1 e op2 serรก

Result = 0000 1001

Como podemos ver, duas variรกveis โ€‹โ€‹sรฃo comparadas pouco a pouco. Sempre que o valor de um bit em ambas as variรกveis โ€‹โ€‹for 1, o resultado serรก 1 ou entรฃo 0.

OR bit a bit

ร‰ representado por um รบnico sinal de barra vertical (|). Duas expressรตes inteiras sรฃo escritas em cada lado do operador (|).

O resultado da operaรงรฃo OR bit a bit รฉ 1 se pelo menos uma das expressรตes tiver o valor 1; caso contrรกrio, o resultado serรก sempre 0.

Vamos considerar que temos 2 variรกveis โ€‹โ€‹op1 e op2 com valores como segue:

Op1 = 0000 1101
Op2 = 0001 1001

O resultado da operaรงรฃo OR nas variรกveis โ€‹โ€‹op1 e op2 serรก

Result = 0001 1101

Como podemos ver, duas variรกveis โ€‹โ€‹sรฃo comparadas pouco a pouco. Sempre que o valor de um bit em uma das variรกveis โ€‹โ€‹for 1, o resultado serรก 1 ou entรฃo 0.

OU exclusivo bit a bit

ร‰ representado por um sรญmbolo (^). Duas expressรตes inteiras sรฃo escritas em cada lado do operador (^).

O resultado da operaรงรฃo OR exclusivo bit a bit รฉ 1 se apenas uma das expressรตes tiver o valor 1; caso contrรกrio, o resultado serรก sempre 0.

Vamos considerar que temos 2 variรกveis โ€‹โ€‹op1 e op2 com valores como segue:

Op1 = 0000 1101
Op2 = 0001 1001

O resultado da operaรงรฃo XOR nas variรกveis โ€‹โ€‹op1 e op2 serรก

Result = 0001 0100

Como podemos ver, duas variรกveis โ€‹โ€‹sรฃo comparadas pouco a pouco. Sempre que apenas uma variรกvel mantรฉm o valor 1, o resultado รฉ 0, caso contrรกrio, 0 serรก o resultado.

Vamos escrever um programa simples que demonstre operadores lรณgicos bit a bit.

#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();
}

Saรญda:

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

Operadores de deslocamento bit a bit

Os operadores de deslocamento bit a bit sรฃo usados โ€‹โ€‹para mover/deslocar os padrรตes de bits para a esquerda ou para a direita. Esquerda e direita sรฃo dois operadores de deslocamento fornecidos pela linguagem 'C', representados da seguinte forma:

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

Aqui,

  • um operando รฉ uma expressรฃo inteira na qual devemos realizar a operaรงรฃo de deslocamento.
  • 'n' รฉ o nรบmero total de posiรงรตes de bits que precisamos mudar na expressรฃo inteira.

A operaรงรฃo de deslocamento para a esquerda deslocarรก o nรบmero 'n' de bits para o lado esquerdo. Os bits mais ร  esquerda na expressรฃo serรฃo exibidos e n bits com o valor 0 serรฃo preenchidos no lado direito.

A operaรงรฃo de deslocamento para a direita deslocarรก o nรบmero 'n' de bits para o lado direito. Os 'n' bits mais ร  direita da expressรฃo serรฃo exibidos e o valor 0 serรก preenchido no lado esquerdo.

Exemplo: x รฉ uma expressรฃo inteira com dados 1111. Apรณs realizar a operaรงรฃo shift o resultado serรก:

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

ShiftOs operadores podem ser combinados e entรฃo podem ser usados โ€‹โ€‹para extracVamos extrair os dados da expressรฃo inteira. Vamos escrever um programa para demonstrar o uso dos operadores de deslocamento bit a bit.

#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;
}

Saรญda:

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

Apรณs realizar a operaรงรฃo de deslocamento para a esquerda o valor se tornarรก 80 cujo equivalente binรกrio รฉ 101000.

Apรณs realizar a operaรงรฃo de deslocamento para a direita, o valor passarรก a ser 5 cujo equivalente binรกrio รฉ 000101.

Operador de complemento bit a bit

O complemento bit a bit tambรฉm รฉ chamado de operador de complemento, pois sempre leva apenas um valor ou um operando. ร‰ um operador unรกrio.

Quando realizamos complemento em qualquer bit, todos os 1 se tornam 0 e vice-versa.

Se tivermos uma expressรฃo inteira que contรฉm 0000 1111, depois de realizar a operaรงรฃo de complemento bit a bit, o valor se tornarรก 1111 0000.

O operador de complemento bit a bit รฉ denotado pelo sรญmbolo til (~).

Vamos escrever um programa que demonstre a implementaรงรฃo do operador de complemento bit a bit.

#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;
}

Saรญda:

Complement - Value of c is -11

Aqui estรก outro programa, com um exemplo de todos os operadores discutidos atรฉ agora:

#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 );}

Depois de compilarmos e executarmos o programa, ele produz o seguinte resultado:

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

Perguntas Frequentes

A operaรงรฃo AND bit a bit (&) opera em bits individuais e retorna um nรบmero inteiro, enquanto a operaรงรฃo AND lรณgica (&&) testa expressรตes inteiras e retorna um รบnico valor booleano, verdadeiro ou falso.

Shift 1. Para criar uma mรกscara: defina com o valor | (1 << n), limpe com o valor & ~(1 << n) e alterne com o valor ^ (1 << n).

Um deslocamento para a esquerda de n multiplica um valor sem sinal por 2 elevado a n; um deslocamento para a direita divide por ele, por isso os compiladores usam deslocamentos para maior velocidade.

Verifique o nรบmero e 1. O bit menos significativo retorna 1 para valores รญmpares e 0 para valores pares, mais rรกpido que o operador mรณdulo.

Firmware embarcado, drivers, criptografia, compressรฃo, grรกficos e redes os utilizam para empacotar sinalizadores, ler registros de hardware, construir mรกscaras de permissรฃo e acelerar cรกlculos aritmรฉticos.

Shift Os operadores sรฃo mais restritivos do que os relacionais, enquanto &, ^ e | estรฃo abaixo da igualdade, mas acima dos operadores lรณgicos && e ||, portanto, use parรชnteses para maior seguranรงa.

Sim. Um assistente de codificaรงรฃo com IA escreve mรกscaras e deslocamentos a partir de um prompt, explica complementos negativos e transforma exemplos binรกrios em cรณdigo C funcional. Sempre teste o resultado.

Copiloto do GitHub Sugere macros de mรกscara de bits, funรงรตes auxiliares para definir e limpar bits e operaรงรตes matemรกticas de deslocamento a partir de um comentรกrio; verifique se as suas conclusรตes correspondem ao seu layout de bits.

Resuma esta postagem com: