-1

Esmiuçando operadores bit-a-bit - Parte 2

criado por Alisson Carlos de F. Rodrigues em 18/03/2007 9:15am
Continuação do artigo: http://www.phpbrasil.com/articles/article.php/id/1392

Como dito no artigo anterior, os operadores bit-a-bit tratam diretamente bits, que são os 0s e 1s lidos pelo processador.
Acredito que qualquer um que esteja lendo esse artigo, e que tenha uma noção básica teórica sobre como funcionam as coisas dentro de um computador, sabe que normalmente (não mais definitivamente) é usado caracteres seguindo a tabela ASCII (Unicode é história pra outro artigo), que são exatamente 255 caracteres que servem pra representar a escrita padrão Ocidental com mais alguns caracteres especiais e ponto.
A cada um desses caracteres é designado ou atribuído um número que vai de 0 (NULL) à 255, 11111111 em binário ou FF em hexadecimal (vazio). Se você leu o artigo anterior (e eu recomendo pra entender este), então deve lembrar que em cores RGB também é usado algo parecido.

http://img329.imageshack.us/img329/6633/asciipq9.gif

Aí em cima está a tabela ASCII com todos os seus 255 caracteres.
Indo direto aos exemplos, o problema: Vamos criar uma função que faça a mesma coisa que funções como strtolower, strtoupper, ucwords, etc. Pra isso também iremos usar um pouco de expressões regulares (excelente tutorial/livro em guia-er.sourceforge.net) e obviamente, operadores bit-a-bit.

Primeiro temos que analisar a relação entre letras maiúsculas e letras minúsculas dentro da tabela ASCII. Tomemos como exemplo a letra “A”. Como maiúscula ela tem o código 65 e como minúscula 97. Diferença de 32 (97-65) que equivale ao caractere espaço (procure sempre olhar esses dados na tabela). Vamos visualizar esses números como binários:

65: 1000001
97: 1100001
32: 0100000

Agora você precisa lembrar como funcionam os operadores “&”, “^” e “|”. Supondo que você queira passar uma letra maiúscula para minúscula você precisará usar o operador “|”. Lembre-se que com esse operador, na posição que tiver pelo menos um número “1” será colocado obviamente um número “1” e onde tiver dois 0s um número “0”. Neste caso você tem a letra “A” (ASCII 65) e vai passar para maiúscula, portanto você deve comparar com “ “ (ASCII 32), analise o esquema abaixo seguindo a regra do operador “|”, assim você chega ao valor 97:

65: 1100001
32: 0100000
97: 1100001

Agora supondo que você tenha a letra “a” (ASCII 97) e queira passar para maiúscula, nesse caso você precisa usar o operador “^”. Lembre-se, com esse operador é atribuído um número “1” onde tiver um “1” e um “0”. Seria basicamente o mesmo do OR, mas se tiver dois números “1” na posição será então atribuído o valor “0”. Observe agora os valores abaixo e analise seguindo a regra do operador “^”, você vai chegar ao valor 65:

97: 1100001
32: 0100000
65: 1000001

Na próxima página eu mostro como isso pode ser feito em PHP e passo a função final de strtolower e strtoupper.

Comentários:

Mostrando 1 - 5 de 5 comentários
Olá

O PHP usa a tabela de caracteres ANSI e não ASCII somente.

A tabela ANSI (American National Standards Institute) é constituída da tabela ASCII (0 a 127) e mais `Latin 1 Windows´ (128 a 255)

Vejam http://ascii-table.com/ansi-codes.php

Por isso o PHP consegue fazer o uppper e o lower com caracteres acentuados utilizando os operadores ^ e | .

Espero ter ajudado.

XXande ;)
09/10/2013 2:13pm (~10 anos atrás)

^ => xor
14/04/2007 7:14am (~17 anos atrás)

Diego disse:
Mto bom...ja utilizava esse metodo aqui no trampo! ^^
09/04/2007 7:18am (~17 anos atrás)

Alisson, este artigo está ótimo...
Porém é algo raramente utilizado em php, acredito que poucos hoje já tiveram problemas que isto ajudaria a resolver!
Abraço,
Felipe
04/04/2007 8:39pm (~17 anos atrás)

O artigo ficou tão ruim assim pra não receber nenhum comentário e ter nota 6.33?
02/04/2007 7:47am (~17 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)