Olá, neste tutorial vou ensinar como funciona os operadores bit a bit
1є Para que servem?
Operadores "bitwise", аs vezes traduzidos como "bit-a-bit", servem pra fazer óperas com bits. Enquanto operadores lógicos avaliam cada lado da operação apenas como verdadeiro ou falso, as operações bit-a-bit geram um valor numérico entre os dois lados da operação.
2є O que é um pouco?
Um bit é a unidade mais pequena que pode ser representada num computador, um bit sу pode conter dois valores, 0 (zero) ou 1 (um). Os bits podem ser agrupados, sendo que, 8 bits correspondem a 1byte, 1024 bytes equivalem a 1 kilobyte, 1024 kilobytes representam 1 Megabyte,
etc.
Bruno da Silva já fez um tutorial sobre ele bem explicado, que explica sobre binários também, mas qualquer dúvida pode perguntar aqui se quiser.
4є Operador OR (|)
O operador OR "|" compare dois valores usando suas representações binárias, para uma expressão ser verdadeira pelo menos um dos bits tem que ser 1, então a expressão é será falsa caso os dois bits sejam iguais a 0. Vejam a tabela da verdade e gravem essas regras para este
operador :
Код:1є Para que servem?
Operadores "bitwise", аs vezes traduzidos como "bit-a-bit", servem pra fazer óperas com bits. Enquanto operadores lógicos avaliam cada lado da operação apenas como verdadeiro ou falso, as operações bit-a-bit geram um valor numérico entre os dois lados da operação.
2є O que é um pouco?
Um bit é a unidade mais pequena que pode ser representada num computador, um bit sу pode conter dois valores, 0 (zero) ou 1 (um). Os bits podem ser agrupados, sendo que, 8 bits correspondem a 1byte, 1024 bytes equivalem a 1 kilobyte, 1024 kilobytes representam 1 Megabyte,
etc.
Bruno da Silva já fez um tutorial sobre ele bem explicado, que explica sobre binários também, mas qualquer dúvida pode perguntar aqui se quiser.
4є Operador OR (|)
O operador OR "|" compare dois valores usando suas representações binárias, para uma expressão ser verdadeira pelo menos um dos bits tem que ser 1, então a expressão é será falsa caso os dois bits sejam iguais a 0. Vejam a tabela da verdade e gravem essas regras para este
operador :
- Código:
ABA|B
1 1 1
1 0 1
0 1 1
0 0 0
http://pt.wikipedia.org/wiki/Tabela_verdade
Como pode ver o operador OR só retorna falso caso os dois bits sejam 0.
Resultados aqui no peão:
PHP como:Como pode ver o operador OR só retorna falso caso os dois bits sejam 0.
Resultados aqui no peão:
- Código:
printf("%d", 1 | 1); // = 1
printf("%d", 0 | 1); // = 1
printf("%d", 1 | 0); // = 1
printf("%d", 0 | 0); // = 0
Mesmo no tуpico do Bruno ensinando pode ter pessoas que ficaram com dъvidas entгo vou explicar de novo aqui...
E se o os nъmeros usados forem diferentes de 1 e 0? Como 8 e 5?
PHP como:E se o os nъmeros usados forem diferentes de 1 e 0? Como 8 e 5?
- Código:
printf("%d", 8 | 5);
Simples , basta pegar o valor binário de 8 e 5, então vamos lá.
Код:- Código:
8 -> 1000
5 -> 0101
Agora sу usar a regra da tabela da verdade e fazer a checagem dos bits.
Код:- Código:
8 5 8|5
1 0 1
0 1 1
0 0 0
0 1 1
Resultado: 1101
Agora o operador transforma os números binários em decimal que é igual a 13 .
Então 8|5 = 13 .
Espero que tenha entendido sobre o OR.
Os operadores um pouco basicamente vão mudar a regra!
5є Operador XOR(^)
Como dito acima os operadores fazem basicamente a mesma função, o que muda é a regra de cada um.
O operador XOR representado pelo ^ (acento circunflexo) compara dois valores binários exatamente como o OR, AND e outros.
A diferença é na regra, para uma expressão ser positiva somente UM dos bits tem que ser 1.
"A conjunção é verdadeira se, e somente se, apenas um dos operandos for verdadeiro". Está escrito no site da tabela da verdade. Lembrando que isso serve para o operador XOR!
Regra:
Код:Agora o operador transforma os números binários em decimal que é igual a 13 .
Então 8|5 = 13 .
Espero que tenha entendido sobre o OR.
Os operadores um pouco basicamente vão mudar a regra!
5є Operador XOR(^)
Como dito acima os operadores fazem basicamente a mesma função, o que muda é a regra de cada um.
O operador XOR representado pelo ^ (acento circunflexo) compara dois valores binários exatamente como o OR, AND e outros.
A diferença é na regra, para uma expressão ser positiva somente UM dos bits tem que ser 1.
"A conjunção é verdadeira se, e somente se, apenas um dos operandos for verdadeiro". Está escrito no site da tabela da verdade. Lembrando que isso serve para o operador XOR!
Regra:
- Código:
ABA^B
1 1 0
1 0 1
0 1 1
0 0 0
Resultados sem peão:
PHP como:- Código:
printf("%d", 1 ^ 1); // = 0
printf("%d", 0 ^ 1); // = 1
printf("%d", 1 ^ 0); // = 1
printf("%d", 0 ^ 0); // = 0
Vou ensinar mais uma vez como fazer quando os valores forem diferentes de 1 e 0, como no exemplo 11 e 7;
Por exemplo:
PHP como:Por exemplo:
- Código:
printf("%d", 11^7);
O operador vai transformar esses valores em binrios, faz a checagem bit a bit e retorna o valor inteiro.
Então vamos lá:
Код:Então vamos lá:
- Código:
11 -> 1011
7 -> 0111
Agora basta aplicar a regra do operador XOR
Код:- Código:
11 7 11^7
1 0 1
0 1 1
1 1 0
1 1 0
Resultado: 1100
Agora o operador converte o 1100 para inteiro que é o mesmo que 12 .
Então 11^7 = 12 .
Viu como é simples?
6є Agora vamos entrar em uma parte um pouco mais complicada... vamos falar dos turnos das operadoras (<< e >>).
7є O que são os operadores de Turnos?
O operador Shift desloca N bits à esquerda ou direita dependendo se for utilizado Shift Left(<<) ou Shift Right(>>). Devido à rapidez, são muitas vezes usadas no programa como multiplicador ou divisor como substituição dos operadores "*" e "/".
O operador Shift Left desloca à esquerda N bits. Pode-se entender o shift left como uma multiplicação por 2 elevado a N. É de enfatizar que um número elevado a 0 é igual a 1, logo, o shift left de 0 equivale a multiplicação por 1.
Resultado de testes no peão usando números binrios para melhor entendimento:
PHP como:Agora o operador converte o 1100 para inteiro que é o mesmo que 12 .
Então 11^7 = 12 .
Viu como é simples?
6є Agora vamos entrar em uma parte um pouco mais complicada... vamos falar dos turnos das operadoras (<< e >>).
7є O que são os operadores de Turnos?
O operador Shift desloca N bits à esquerda ou direita dependendo se for utilizado Shift Left(<<) ou Shift Right(>>). Devido à rapidez, são muitas vezes usadas no programa como multiplicador ou divisor como substituição dos operadores "*" e "/".
O operador Shift Left desloca à esquerda N bits. Pode-se entender o shift left como uma multiplicação por 2 elevado a N. É de enfatizar que um número elevado a 0 é igual a 1, logo, o shift left de 0 equivale a multiplicação por 1.
Resultado de testes no peão usando números binrios para melhor entendimento:
- Código:
printf("%b", 1011 << 1); // = 0110
printf("%b", 1011 << 2); // = 1100
printf("%b", 1011 << 3); // = 1000
printf("%b", 1011 << 4); // = 0000
*Obs: Estou usando %b para retornar valores binários, se você faz o teste verá que irá retornar um valor muito maior, mas NESTE caso basta pegar os ъltimos quatro nъmeros
Resumindo, ele empurra os bits e vai adicionando um 0.
Agora vamos usar valores decimais sem peão:
PHP como:Resumindo, ele empurra os bits e vai adicionando um 0.
Agora vamos usar valores decimais sem peão:
- Código:
printf("%d", 5 << 1); // = 10
printf("%d", 5 << 2); // = 20
printf("%d", 5 << 3); // = 40
printf("%d", 5 << 4); // = 80
printf("%d", 5 << 5); // = 160
Acho que deu pra perceber que ele multiplica o 5 por 2 N vezes. Exemplo:
5 << 1 = 5*2 = 10
5 << 2 = 5*2*2 = 20
5 << 3 = 5*2*2*2 = 40
5 << 4 = 5*2*2*2 *2 = 80
5 << 5 = 5*2*2*2*2*2 = 160
O mesmo serve para outros valores por exemplo:
10 << 3 = 10*2*2*2 = 80 Você
deve estar se perguntando , mas pra que eu vou usar isso?
Os turnos das operadoras são muito rápidos , mais rápidos que os operadores de multiplicação e divisão "*" e "/", por isso sempre que podem é bom usá-los. Tem esse exemplo também no tutorial de otimização do Bruno da Silva:
Citar:5 << 1 = 5*2 = 10
5 << 2 = 5*2*2 = 20
5 << 3 = 5*2*2*2 = 40
5 << 4 = 5*2*2*2 *2 = 80
5 << 5 = 5*2*2*2*2*2 = 160
O mesmo serve para outros valores por exemplo:
10 << 3 = 10*2*2*2 = 80 Você
deve estar se perguntando , mas pra que eu vou usar isso?
Os turnos das operadoras são muito rápidos , mais rápidos que os operadores de multiplicação e divisão "*" e "/", por isso sempre que podem é bom usá-los. Tem esse exemplo também no tutorial de otimização do Bruno da Silva:
Postado originalmente por ipsBruno Caso você esteja usando: PHP como:
é muito mais otimizado você usar PHP como: [/size]
|
Espero que tenha entendido!
9є Shift Right(Deslocamento de bits à direita)
Como você viu o Shift Left pode-se entender como uma multiplicação por 2 elevado a N, já o Shift Right é ao contrário, ao invйs dele multiplicar ele faz a divisão por 2 elevado a N
Resultado dos testes no peão usando binários :
PHP como:9є Shift Right(Deslocamento de bits à direita)
Como você viu o Shift Left pode-se entender como uma multiplicação por 2 elevado a N, já o Shift Right é ao contrário, ao invйs dele multiplicar ele faz a divisão por 2 elevado a N
Resultado dos testes no peão usando binários :
- Código:
printf("%b", 1010 >> 1);// = 0101
printf("%b", 1010 >> 2);// = 0010
printf("%b", 1010 >> 3);// = 0001
printf("%b", 1010 >> 4);// = 0000
Peguei exemplo de um site para vocês entenderem melhor!
PHP como:- Código:
new a = 10101011;
a >> 0 = 10101011;
a >> 1 = 01010101;
a >> 2 = 00101010;
a >> 3 = 00010101;
a >> 4 = 00001010;
a >> 5 = 00000101;
(...)
Agora olhem os testículos com números decimais:
PHP como:- Código:
printf("%d", 60 >> 1); // = 30
printf("%d", 60 >> 2); // = 15
printf("%d", 60 >> 3); // = 7
printf("%d", 60 >> 4); // = 3
printf("%d", 60 >> 5); // = 1
Entendendo:
60 >> 1 = 60/2
60 >> 2 = 60/2/2
60 >> 3 = 60/2/2/2
E assim por diante...
10є Diferença entre >> e >>>
Pelo o que eu andei lendo um nгo diferenteй muito masй fundamental.
Se você tem esse valor abaixo que é -10 convertido em binário por exemplo:
PHP como:60 >> 1 = 60/2
60 >> 2 = 60/2/2
60 >> 3 = 60/2/2/2
E assim por diante...
10є Diferença entre >> e >>>
Pelo o que eu andei lendo um nгo diferenteй muito masй fundamental.
Se você tem esse valor abaixo que é -10 convertido em binário por exemplo:
- Código:
11110110// -10
e você deseja usar deslocar os bits dele então você vai lá e faz:
PHP como:- Código:
11110110 >> 1
O resultado vai ser 01111011 que ao abrir de ser -5 é 123 , porque o operador >> não preenche a esquerda com o bit do sinal, ele sempre vai preencher com 0 .
Agora se você fez:
PHP como:Agora se você fez:
- Código:
11110110 >>> 1
O resultado vai ser 11111011 que é igual a -5 , como pode ver ele preencheru a esquerda com 1 que era o bit antigo e não o 0 como faz o >>.
11º Complemento para dois (binários negativos)
Falando com o Stewie' no MSN, ele me explicou sobre transformar um valor inteiro em negativo pela representação binária do mesmo.
É simples. Explicação: tenho o nъmero 10 , interativo em binário ele fica 1010 , mas como o limite de dados й 8 bits(1 byte) completamos o valor, ficando: 00001010 . Agora para descobrir o negativo invertemos os valores.
Positivo : 00001010
Negativo: 11110101
Assim temos o -10
Créditos dessa parte ao Stewie' por ter me explicado
Creditos: Bruno Pereira
Sei que ficou grande mas tentei deixar o mais explicado possível, pode haver erros por que comecei a estudar sobre os operadores ontem a noite. Então qualquer erro me avisem por favor.
Abraços!
11º Complemento para dois (binários negativos)
Falando com o Stewie' no MSN, ele me explicou sobre transformar um valor inteiro em negativo pela representação binária do mesmo.
É simples. Explicação: tenho o nъmero 10 , interativo em binário ele fica 1010 , mas como o limite de dados й 8 bits(1 byte) completamos o valor, ficando: 00001010 . Agora para descobrir o negativo invertemos os valores.
Positivo : 00001010
Negativo: 11110101
Assim temos o -10
Créditos dessa parte ao Stewie' por ter me explicado
Creditos: Bruno Pereira
Sei que ficou grande mas tentei deixar o mais explicado possível, pode haver erros por que comecei a estudar sobre os operadores ontem a noite. Então qualquer erro me avisem por favor.
Abraços!