Bit a bit Operatores em C: AND, OR, XOR, Shift & Complemento
O que sรฃo Bitwise Operatores?
Bit a bit Operatoros sรฃo usados โโpara manipular dados em nรญvel de bit, tambรฉm chamado de programaรงรฃo em nรญvel de bit. Bitwise opera em um ou mais padrรตes de bits ou nรบmeros binรกrios no nรญvel de seus bits individuais. Eles sรฃo usados โโem cรกlculos numรฉricos para tornar o processo de cรกlculo 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 |
Os 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 o 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 o lado esquerdo ou direito. Esquerda e direita sรฃo dois operadores de turno fornecidos por 'C'que sรฃo 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 s podem ser combinados, entรฃo podem ser usados โโpara extrair os dados da expressรฃo inteira. Vamos escrever um programa para demonstrar o uso de operadores de deslocamento bitwise.
#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 todas as operaรงรตes discutidas 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
Resumo
- Operadores bit a bit sรฃo conjuntos de operadores especiais fornecidos por 'C.'
- Eles sรฃo usados โโna programaรงรฃo em nรญvel de bit.
- Esses operadores sรฃo usados โโpara manipular bits de uma expressรฃo inteira.
- Lรณgico, deslocamento e complemento sรฃo trรชs tipos de operadores bit a bit.
- O operador de complemento bit a bit รฉ usado para reverter os bits de uma expressรฃo.
