Olá e bem-vindo. Vamos falar sobre operadores bit a bit.
Mostramos a você um pequeno vislumbre disso na aula anterior, quando falamos sobre operadores de atribuição, porque
os operadores de atribuição têm todas essas atribuições compostas onde você pode
realizar uma operação como uma adição e, em seguida, também atribuir.
Você pode fazer as mesmas coisas com esses operadores de tipo.
Mas vamos entrar em mais detalhes e dizer exatamente o que são.
Portanto, c oferece operadores lógicos bit a
bit e operadores de deslocamento. Esses termos podem ser completamente ignorantes.
Eles parecem operadores lógicos, mas são bastante diferentes. Eles não fazem nenhum tipo
de avaliação booleana. Eles não avaliam verdadeiro ou falso.
Eles se parecem com o "e" comercial, os 2 ors, mas
não estão fazendo nenhum tipo de avaliação booleana.
O que eles estão fazendo é operar em bits, dentro de valores inteiros.
E então você pode se perguntar por que diabos você iria querer fazer isso? Bem, não é
usado na maioria dos programas. É mais uma técnica avançada.
Mesmo que esta seja uma aula para iniciantes. Eles fazem parte dos operadores e os operadores são um conceito iniciante.
Vou abordá-los, mas não necessariamente nos concentraremos neles.
Vou te dar alguns exemplos, mostrar como você pode usá-los.
Mas você não será um especialista nisso depois desta palestra.
Mas a maneira como eles são úteis e por que você realmente deseja usá-los é porque
você pode armazenar uma grande quantidade de dados.
Portanto, há operandos bit a bit chamados e, e comercial e o bit a bit ou que
é uma ou apenas uma única barra paralela.
Tente não confundi-los novamente com os operadores lógicos.
Os operadores lógicos têm 2 deles, E comercial e comercial, que é um e.
Os operadores bit a bit têm apenas um. Portanto, apenas um "e" comercial ou apenas um ou.
E então o que eles vão fazer é testar e definir bits individuais
dentro de uma variável inteira. O que é um pouco?
Sabemos que um pouco é uma forma de medir dados.
Mas um bit é essencialmente apenas um valor 0 ou 1.
E 8 deles constituem um byte. Portanto, um bit é 0 ou 1.
E o que você pode fazer é um número
inteiro, lembre-se, dependendo do sistema que você está executando, pode ser de 8 bytes.
E assim você pode ligar e desligar cada bit.
E quando digo ligar ou desligar, estou dizendo que você pode fazer com que sejam iguais a 1 ou 0.
E então você pode usar esses bits para lhe dizer algo.
Portanto, você pode armazenar muitos dados fazendo com que os bits representem algum tipo de dado.
É por isso que um dos motivos pelos quais o
computador usa bits em 1 e 0s e números binários para fazer operações, porque você pode
armazenar muitos dados. Agora, exatamente
o que isso significa é um exemplo. Você pode usar uma única variável inteira.
Novamente, um inteiro é um número, um inteiro representa de 4 a 8
bytes, dependendo de qual sistema você está executando.
Isso significa que se houver 4 bytes, isso significa que há 32 bits.
Existem 32 valores 0s ou 1.
Portanto, você pode usar todos esses bits para representar algo.
Então, por exemplo, se você quiser armazenar caracteres individuais de uma pessoa, você pode ter apenas 1
bit, dizer se a pessoa é ou não do
sexo masculino ou feminino, dizendo que 1 é igual a masculino 0 é igual a feminino.
Você apenas liga ou desliga.
Em seguida, você pode usar 3 bits para
especificar se a pessoa pode falar francês, alemão ou italiano.
Portanto, o 1 bit pode representar o francês. Se não for 10,
isso significa que eles não falam francês.
Se alemão for 0, isso significa que eles não falam alemão.
Se for 1, significa que falam alemão. Então, desligando e ligando esses bits,
definindo-os de 1 a 0, você pode representar muitos dados.
Você poderia ter outra parte para registrar se o salário da pessoa é 50.000 ou mais.
Se for 1, é verdade, sim, é. 0 falso.
Basicamente, apenas especificamos aqui.
Na verdade, diz 4, mas na verdade especificamos 5 bits de dados,
apenas 5 de se temos ou não 32 ou
se temos 64 bits, mas usamos apenas 5 e podemos representar
se uma pessoa é ou não do sexo feminino ou masculino , falem ou não
francês, alemão ou italiano ou todos os 3 ou um ou outro.
E independentemente de estarem ganhando ou não mais de $ 50.000.
Podemos representar todos esses dados em nossos bits.
E é aqui que os operadores bit a bit são úteis.
Agora que sabemos como podemos usar bits para armazenar muitos
dados diferentes. Vamos falar sobre esses números binários.
Sabemos que um número binário é apenas um número que inclui 1s e 0s.
E é por isso que é vantajoso usar. Operadores de bits em um inteiro, o
número pode ter qualquer comprimento.
A seguir estão exemplos de números binários, apenas 0s e 1s.
Então você viu isso 0 1 0 1 0 1 1 0 1 0 1 0.
E lembre-se de que um byte tem 8 bits.
Um número inteiro geralmente tem 4 bytes na maioria das plataformas.
Depende da arquitetura, mas principalmente de 32 bits.
Portanto, você tem 32 valores que podem ser armazenados com 1s e 0s para indicar ativado ou desativado.
Números binários, mais uma vez, cada número binário tem um valor decimal
correspondente, então você precisa entender como converter binário em decimal.
Exemplos aqui 1 é igual a 1, 1 0 é 2, 1 1
é 3, essas são conversões simples.
Novamente, geralmente eles têm mais bits, 1 0 1 0 1 1 1.
A maneira como você deseja converter os números binários em
um número decimal é olhar cada
posição no byte com o bit correspondente e, em seguida, usar a potência de 2.
Portanto, para cada dígito, você multiplica o dígito por seu valor
de posição usando a potência de 2. E então você soma todo o projeto para chegar ao resultado final.
Portanto, os valores de posição e um número binário são as potências de 2.
Portanto, a primeira posição seria o valor 2 0,
que, em outras palavras, seria 1.
E então a segunda posição seria o valor de 2 elevado à primeira potência, que é
2, 2 elevado a 2 seria 4, 2 a 3 seria 8,
2 elevado a 4 seria 16. E você
continua fazendo isso indefinidamente. E é mais fácil entender se você vir um bom exemplo.
E aqui temos um número binário de 0 1 1 0 1 0 0 1.
O equivalente decimal disso é 105.
A maneira de converter é começar no lado direito para cada bit
e multiplicar à potência de 2 dependendo se o bit for 0 1.
Portanto, se começarmos para a direita, temos 1.
Então dizemos 1 vezes 1 e mantemos esse 1. Então o próximo 1, a
segunda posição é 0 vezes 2 0. Em seguida, 0 vezes 4,
1 vezes 8, 0 vezes 16,1 vezes 32, 1
vezes 64 e 0 vezes 28.
E você soma tudo isso e obtém o resultado de 105.
Essa é uma maneira de converter. Você também pode convertê-lo da esquerda
para a direita multiplicando por 2 e, em seguida, adicionando 1 ou
adicionando 0, dependendo de qual é o próximo bit. Por exemplo, você também
pode, se for da esquerda para a
direita, começar com 1 porque 0 não importa.
Então, o segundo bit indo da esquerda para a direita, você tem 1.
O terceiro bit, você tem 1 vezes 2 mais 1,
então você tem 3.
E novamente, você multiplica por 2, então você diz 3 vezes 2 mais 0, que é 6.
6 vezes 2 mais 1, que é 13.
13 vezes 2 é 26.
26 vezes 2 é 52
vezes 2, que é 104 mais 1.
Portanto, multiplique novamente por 2 e, em seguida, some 1. Outro exemplo, novamente, da direita
para a esquerda geralmente é um pouco mais fácil.
Aqui está 1 0 0 1 1 1 0 0.
E isso se converte em 156 porque você diz novamente 0 vezes 1,
0 vezes 2, 1 vezes 4, 1 vezes 8, 1 vezes 16
e assim por diante e então
você adiciona todos juntos, que é 4 8 12 16 28 mais 128 é 156 .
E, novamente, se você for da esquerda para a direita, você multiplica por 2, adiciona 1.
Então começamos por 1. Diga 1
2 4 9, 4
vezes 2 mais 1, 9 vezes
2 é 18 mais 1 é 19 vezes
2, 38 mais 1 é 39 vezes 2, que
é 78 vezes 2, que é 156.
Portanto, esta é uma demonstração rápida de como você
pode converter binário em decimal. Agora, convertendo decibéis em binários,
normalmente só uso uma conversão na web
se você estiver realmente interessado nisso. Mas você pode pegar esses números binários e, em seguida, executar operadores
bit a bit. Portanto, vamos dar uma olhada nos operadores bit a bit.
Portanto, os operadores bit a bit são resumidos aqui. E, novamente, outra boa mesa que coloquei
online, mas eles se parecem com operadores lógicos. Mas, novamente, não os confunda.
Portanto, o E comercial por si só é um operador binário.
E então o que isso está fazendo é copiando um pouco para o
resultado se ele existir em ambos os operandos. Portanto, se ambos forem verdadeiros, será
copiado um pouco.
Portanto, se aeb são iguais a 12, você
terá uma representação binária de 0 0 0 0 1 1 0 0.
Portanto, aeb seriam
esse número. Veremos alguns exemplos.
Um binário ou copia um bit se ele existir em qualquer operando, então
a ou b copiará um
bit se ele existir em qualquer operando. Portanto, se qualquer operando
for igual a 1, ele copiará um bit.
E então o xor binário, este é o or exclusivo.
Isso copiará o bit se ele estiver definido em 1 operando, mas não em ambos.
Então, se você tem um verdadeiro, mas apenas
1 verdadeiro e usa a cenoura para representar isso no seu teclado,
então vai copiar um pouco e vai dizer que
é verdade,
complemento binário de 1s.
Então, novamente, estamos obtendo os dados binários aqui porque estamos falando sobre bits. Com sorte, complemento de
1.
O operador é unário e tem
o efeito de inverter os bits, basicamente negando e tirando o monitor.
Portanto, um exemplo aqui é se você disser til a,
estará aplicando o operador de complemento 1s.
E se for igual a 61 negativo, será 1 1 0 0 0 0 1.
Então, se você realmente converter esse número binário
em decimal, que é um número negativo e o primeiro
número é o sinal. Então, eu digo a você que é um sinal.
E então você diz 1 2 4 8 16 33 e
então 61, então é assim que seria representado.
Vou dar exemplos mais concretos disso.
Mas basicamente, se você tiver um número binário, a é inicialmente um número binário que é 0 0 1
1 1 1 0 0 que é 60 e você fornece
a inversão basicamente ele vai se transformar em
61 negativo, que é 1 1 0 0 0 0 0 0 0 0 0 1 1.
Portanto, estes são os resultados das variáveis que estão realmente definidas. Então, novamente, estou assumindo
que a tem certa representação binária eb tem uma certa representação binária.
Portanto, se a for igual a, novamente, 60 e
b for igual a 13, o resultado de adicioná-los juntos fazendo um
bit a bit e será 0000 11 00, que é 12.
Novamente, examinarei esses exemplos, mas tentarei fornecer uma
pequena descrição desses diferentes operadores binários.
O símbolo de menos que menos vai deslocar os bits para a esquerda.
Portanto, o valor do operando esquerdo é movido para a esquerda pelo número de bits especificado pelo operando branco.
Então, se você fizer algo como menos
que menos que
2 e a é realmente igual a você conhece
algum número binário, por exemplo, 0 0 1 1 1 1 0 0, você vai
deslocar os bytes em 2.
Então, você vai tirar os 0s e eles se tornarão 1 1 1 1, e esses 0s vão para o fim.
E o mesmo com o operador de turno certo. Você está apenas deslocando-os para a direita em oposição à esquerda.
Aqui você usa os símbolos maior que.
E então vou examinar isso em um segundo.
Outra coisa importante a entender com os operadores bit a bit é
como avaliar esses valores a e b. Então, o que 1
e 1 resultam em 1, se for um
e comercial. Se for 1 ou 1
e 1 também será avaliado como 1.
Mas um 1 e 1 e um 0 se você estiver usando um E comercial
fazendo um e, isso é avaliado como 0 falso. Então, eu só queria fornecer uma pequena
tabela verdade aqui que mostra os valores quando você está
fazendo isso, você usa um e um ou um ou exclusivo.
Então aqui se você tem p0 e q0, o que significa que ambos são
falsos e você aplica um e, será
falso porque ambos têm que ser verdadeiros para que isso seja verdade.
E é isso que você vê na linha 3.
Ambos são verdadeiros, então peq será avaliado como 1, verdadeiro.
Se ambos não forem verdadeiros, é sempre falso.
P ou q apenas 1 deles precisa ser verdadeiro.
É por isso que você vê as linhas 1 e 2 iguais a 1 e a linha 3 igual a 1.
A única vez em que é falso é quando ambos são falsos.
E então o exclusivo ou é pelo menos 1 deles
é verdadeiro, e apenas 1.
Portanto, se p for falso eq for verdadeiro, ele retornará verdadeiro.
E se p for verdadeiro eq for falso, ele retornará 1.
Portanto, isso dá uma ideia de como ele é avaliado.
Novamente, um monte de coisas matemáticas, mas quando falamos sobre dígitos binários, é disso que estamos falando.
Então, vamos dar uma olhada em alguns exemplos concretos e blocos de código. Esperançosamente, isso ajudará um pouco.
Então aqui está nossa função. Vou criar mais algumas variáveis.
Vou ter certeza de que eles não estão assinados,
mesmo que seja por padrão. Então, se eu disser unsigned
int a e atribuí-lo a 60, isso será representado em binário como
0 0 1 1 e 11 00.
Se eu criar outra variável sem sinal e disser int
b e atribuir a isso o valor
de 13, isso será realmente representado como em binário 0 0
00 1 1 0 1. Você pode fazer as conversões lá.
Mas o que quero demonstrar aqui é que, quando você configura esses números
binários, pode desligar os bits usando os diferentes operandos bit a bit.
Agora, vou apenas criar um resultado int e vou dizer que
será igual a 0.
E vai conter o resultado da operação bit a bit.
Operação. Agora, se eu disser que c é
igual a a e aplicar o operando bit a bit eb, agora o que
isso deve fazer é se a for igual a 1 e b for igual a
1, esses bits serão ativados. Então, o que você esperaria do resultado deste v.
Bem, você olha para o primeiro bit de a e olha para o primeiro bit de
b e ambos são 0.
Portanto, o resultado será 0 porque
se você fizer isso verdadeiro em a e b, os dois precisam ser verdadeiros para serem 1.
Portanto, o próximo também será 0. O próximo é 1 e 0, o terceiro bit.
Portanto, ainda é 0, 1 e 0 ainda é 0. E agora temos um 1 e um 1.
Então, agora finalmente temos um verdadeiro. Temos outro 1 e 1. Temos um verdadeiro.
E então 0 e 0 serão 0 e 0 e 1
serão 0.
Então o resultado se eu tentar imprimir c, vai imprimir o
valor no formato decimal. Se eu fizesse algo assim,
ele imprimiria o equivalente decimal desse número binário, que seria
o equivalente a 0 0 0 0.
E isso tudo é a conversão de binário em decimal, então você precisa entender
como fazer isso para entender este exemplo. Mas 0 0 0 0 1
1 0 0 é na verdade 1 3 7, o valor
é na verdade 12, 1 3 6 12.
Então, isso imprimiria doze se
eu fosse imprimir
c ou o resultado seria melhor.
Então, se eu executar isso, você verá que o valor é 12.
Na verdade, ele desligou e ligou todos os bits com base na comparação do e comercial.
Então agora eu
digo correr, vemos que o valor está em d12 porque
está desligando e ligando os bits e vai
realmente ser representado como 0 0 0 1 1
0 0 que é o valor 12 porque estamos imprimindo um decimal .
Se eu fosse mudar isso e agora quero fazer
um ou e ainda estou fazendo o ou e o ou lembre-se
que é
a barra paralela ao lado do enter, agora só irei ligar os
bits se 1 for verdadeiro. Então 00, ambos
são falsos. Novamente, estou comparando aqui.
Estou comparando esses bits para 16 e 13.
16 é representado como binário 0 0 1 1 1 1 0 0.
13 é representado em binário 0 0 0 0 1 1 0 é 1.
Cada um desses números representa um bit.
Portanto, o primeiro bit em 60 é 0, o primeiro bit em 13 é 0.
E se eu pedir esses juntos, 0 e 0, ainda terei 0. Então esse é o primeiro resultado da primeira parte.
Segundo bit 00 novamente. O terceiro bit é 1 para 60
e é 0 para 13.
Agora, tudo isso significa que preciso ter 1 verdadeiro, então será um 1.
O mesmo vale para os bits 4 e 16, 13. Portanto, agora tenho um 1 novamente.
E então 1 e 1, ambos são verdadeiros. Então, novamente 1, tudo que
eu preciso é 1 verdadeiro, outro 1.
Ambos são falsos, então isso não vai ser verdade. 0, lembre-se que não é
verdade, 1 é verdadeiro e 0 11. Portanto, agora tenho 0 0 1 1 1 1 0 1.
E o valor disso em decimal, se eu fosse imprimir,
é novamente que você tem que entender como
converter binário em decimal, mas basicamente vai 1 3
7 15 30 61. Então, isso vai imprimir 61.
Encerre este programa e reconstrua-o,
e veremos um valor de 61.
Portanto, são operadores bit a bit. E, novamente, é um
tipo de programa mais avançado, mas é uma boa
maneira de representar muitos dados usando "e" comercial e assim por diante,
ativando e desativando bits, essencialmente. Então você pode brincar
com isso. Você poderia fazer o exclusivo ou o que é a cenoura.
A cenoura está acima do 6, o número 6 do teclado.
Você veria um resultado diferente. Se você adicionar o til, isso basicamente desligará tudo.
Então, para a e a é igual a 60, 0 0 1 1 1 1 0 0,
não vai ser igual a 1 1 0 0 0 0 1 1.
Outra coisa muito legal que você pode fazer com os operadores binários é alternar,
mover para a esquerda e para a direita. Existem algumas coisas importantes que você sabe quando
precisa deslocar para a esquerda ou direita.
Em primeiro lugar, sabemos que um int não assinado significa que
só pode ser positivo. Não pode ser negativo.
Portanto, se você estiver armazenando um valor negativo lá, a compilação o converterá em mais tempo, ocupará muito tamanho.
Portanto, lembre-se de que os valores não assinados significam que você só pode ter valores positivos.
Inteiros com sinal significam que podem ser negativos ou positivos.
Mas se você quiser mudar,
lembre-se de mudar para a esquerda, então agora se dissermos resultado
igual e digamos que queremos mudar um, digamos, por 2, a outra
coisa importante que você
quer saber é quando você tem os inteiros, os
inteiros são, lembre-se, eles têm 4 bytes na
maioria das plataformas. Depende de você conseguir
o tamanho fazendo o tamanho do operador. Então, o número inteiro é
na verdade 4 é 32 bits, então o
número é algo assim. Os 16 algo
assim o que é 4 8 12 16 20 24.
Então você provavelmente algo assim e algo parecido.
Esse é realmente o número. Eu só mostrei os últimos
8 bits porque o resto eram 0s. Mas se você olhar para isso como
um número inteiro de 32 bits, que é 4 bytes, é o
que parece em binário, 4 0s 4 0s 4 0s 4 0s 4 0s 4
0s e então 0 0 1 1 1 1 0 0 .
E então você tem que saber o tamanho ao fazer o deslocamento para
a esquerda ou para a direita, porque se você deslocar mais de 2, não ficará claro.
Não cai nem nada parecido.
Então, novamente, deixe-me ter certeza de 48 12 16 20 24 28
32 e o mesmo seria válido para 13.
Portanto, se você mudar para a esquerda um valor maior
que 2, o que você vai acabar tendo é que esses 1s
também vão se deslocar para a esquerda. Portanto, o resultado ainda
será todos aqueles 0s anteriores, mas
você terá 1 1 1 1 0 0 0 0.
E isso vai ser igual a 240.
E se eu fizer uma conversão rápida, faço na minha cabeça dizendo
1 3 7 15 30 60 122 40, mas
podemos confirmar isso criando e executando e você verá que
o resultado é 240.
E vemos que o resultado é 240.
Portanto, agora, se você quiser realmente mudar para meus mais de 2 s,
digamos que queira mudar para 4, é então que se torna importante entender que é um número de 32 bits.
Então aqui você realmente teria que usar alguns desses 0s.
Então, se você quiser mudar para 4, o que você realmente
terá é algo assim.
E então, se você quiser agrupá-los
por 4, você terá
algo assim. Então, o resultado aqui
seria novamente se eu fizer isso na minha cabeça,
você tem 1 3 7 15 30 60
120 240 480 e então 960.
Felizmente, eu fiz isso direito. Novamente, quando executamos isso e dizemos
960, isso está mudando
para a esquerda. Se você quiser
deslocar para a direita, use os símbolos de maior que.
Assim, mudando para o operador de deslocamento direito binário certo,
você faz o maior que. Operador de deslocamento binário para a esquerda, você faz o menos.
Então, aqui, se você for deslocar para a direita, você deseja mover para a direita 4.
E o que acontece se você tiver o fim aqui, então, se você tiver
o 60 original, tente ir 4. Você terá dígitos que simplesmente são descartados.
Então, em vez de ter esses últimos 4, que
originalmente novamente temos 60. Portanto, temos 0
0 0 1 1 1 1 0 0, temos que mover 4.
Então vamos acabar perdendo 2 bits porque eles vão cair.
E o que vamos
acabar com é algo como
0 0. E isso seria igual a 3, algo
assim, então você realmente perde bits porque está mudando muito para a direita, você
tem o resultado de 3. Portanto, você deve ter cuidado ao
deslocar para a esquerda e para a direita, certifique-se de usar esses 4
bytes de 32 bits novamente, dependendo do seu sistema.
É um resumo rápido dos operadores bit a bit.
Quando você fica mais avançado, precisa entender como pode
realmente verificar se um determinado bit é 1 ou 0.
É muito simples. Você apenas faz um e sobre ele.
Mas você precisa escrever um pouco mais de código.
Esta palestra não teve o objetivo de ser uma análise exaustiva dos operadores bit a bit.
Eu queria dar uma visão geral,
dar a você uma boa vantagem nisso. Mas para entender melhor esses operadores,
você terá que estudar um pouco mais, usá-los e praticá-los.
Espero que tenha sido útil. Novamente, pode ficar um pouco confuso,
então você deseja seguir e brincar com isso. Mas, novamente, qual é a melhor maneira de aprender,
escrever algum código, aprender alguns exemplos. Obrigada.