Escolar Documentos
Profissional Documentos
Cultura Documentos
MANIPULAO DE BITS
OBJETIVOS
Resumo
O.1 Introduo
O.2 A manipulao de bits e os operadores bit a bit
O.3 A classe BitArray
Resumo Terminologia
O.1 Introduo
Neste apndice apresentaremos uma discusso extensa sobre a manipulao de bits e os operadores bit a bit que a permitem.
Tambm discutiremos a classe BitArray, por meio da qual possvel criar objetos teis para manipular conjuntos de bits.
O operador de deslocamento esquerda desloca o valor 1 do bit de ordem inferior (mais direita) para o bit de ordem superior
(mais esquerda) em displayMask e preenche os bits 0 a partir da direita. Como o segundo operador 31, 31 bits (cada um
0) so preenchidos a partir da direita. A palavra preencher nesse contexto significa que inclumos um bit no lado direito e
exclumos um no lado esquerdo. Toda vez que inclumos um 0 no lado direito, removemos o bit no lado esquerdo.
A instruo da linha 79 determina se um 1 ou um 0 deve ser anexado StringBuilder output para o bit mais es-
querda da varivel number. Nesse exemplo vamos assumir que number contm 11111 (00000000 00000000 00101011
& E bit a bit Cada bit do resultado configurado como 1 se os bits correspondentes dos dois
operandos forem ambos 1. Caso contrrio, o bit configurado como 0.
| OU bit a bit inclusivo Cada bit do resultado configurado como 1 se pelo menos um dos bits correspondentes
dos dois operandos for 1. Caso contrrio, o bit configurado como 0.
^ OU bit a bit exclusivo Cada bit do resultado configurado como 1 se exatamente um dos bits correspondentes
dos dois operandos for 1. Caso contrrio, o bit configurado como 0.
<< deslocamento esquerda Desloca os bits do primeiro operando esquerda pelo nmero de bits especificado pelo
segundo operando; preenche a partir da direita com bits 0.
>> deslocamento direita Desloca os bits do primeiro operando direita pelo nmero de bits especificado pelo
segundo operando. Se o primeiro operando for negativo, 1s so deslocados a partir da
esquerda; caso contrrio, 0s so deslocados a partir da esquerda.
~ complemento Todos os bits 0 so configurados como 1, e todos os bits 1 so configurados como 0.
0 0 0
1 0 0
0 1 0
1 1 1
Figura O.2 Resultados da combinao entre dois bits com o operador E bit a bit (&).
0 0 0
1 0 1
0 1 1
1 1 1
Figura O.3 Resultados da combinao entre dois bits com o operador OU bit a bit inclusivo (|).
0 0 0
1 0 1
0 1 1
1 1 0
Figura O.4 Resultados da combinao entre dois bits com o operador OU bit a bit exclusivo (^).
Apndice O Manipulao de Bits O-173
01100111). Quando number e displayMask so combinados usando &, todos os bits (exceto o bit de ordem superior
da varivel) number tm uma mscara (so ocultos), porque qualquer bit E 0 resulta em 0. Se o bit mais esquerda
0, number & displayMask avaliado como 0 e 0 anexado; caso contrrio, 1 anexado. Em seguida, a linha 83 muda
a varivel val um bit com a expresso number << = 1 (isso equivalente a number = number << 1). Essas etapas so
repetidas para cada bit da varivel number. No final do mtodo GetBits, a linha 89 converte StringBuilder em uma
string e a retorna do mtodo.
50 {
51 displayLabel.Text = GetBits(
52 Convert.ToInt32( inputTextBox.Text ) );
53 }
54
55 // se o valor no um inteiro, a exceo declarada
56 catch ( FormatException )
57 {
58 MessageBox.Show( Please Enter an Integer,
59 Error, MessageBoxButtons.OK,
60 MessageBoxIcon.Error );
61 }
62 }
63
64 } // fim do mtodo inputTextBox_KeyDown
65
66 // converte o inteiro em sua representao de bits
67 public string GetBits( int number )
68 {
69 int displayMask = 1 << 31;
70
71 StringBuilder output = new StringBuilder();
72
73 // obtm cada bit, inclui espao a cada 8 bits
74 // para formatao da exibio
75 for ( int c = 1; c <= 32; c++ )
76 {
77 // anexa 0 ou 1 dependendo do resultado da mscara
78 output.Append(
79 ( number & displayMask ) == 0 ? 0 : 1 );
80
81 // mudana esquerda para que a mscara encontre o bit do
82 // prximo dgito durante a prxima interao do lao
83 number <<= 1;
84
85 if ( c % 8 == 0 )
86 output.Append( );
87 }
88
89 return output.ToString();
90
91 } // fim do mtodo GetBits
92
93 } // fim da classe PrintBits
O programa da Figura O.6 demonstra os operadores E bit a bit, OU bit a bit inclusivo, OU bit a bit exclusivo e comple-
mento bit a bit. O programa usa o mtodo GetBits, o qual retorna uma string contendo a representao em bits de seu
argumento inteiro. Os usurios fornecem valores em TextBoxes e pressionam o boto correspondente operao que eles
gostariam de testar. O programa exibe o resultado nas representaes inteiras e de bits.
Figura O.6 Demonstrando os operadores E bit a bit, OU bit a bit inclusivo, OU bit a bit exclusivo e complemento bit a bit.
(Parte 2 de 3.)
Apndice O Manipulao de Bits O-177
Figura O.6 Demonstrando os operadores E bit a bit, OU bit a bit inclusivo, OU bit a bit exclusivo e complemento bit a bit.
(Parte 3 de 3.)
O-178 C# Como Programar
A primeira janela de sada da Figura 0.6 mostra os resultados da combinao entre o valor 17 e 20 usando o operador
E bit a bit (&); o resultado 16. A segunda janela de sada mostra os resultados da combinao entre o valor 17 e 20 usando o
operador OU bit a bit; o resultado 21. A terceira sada mostra os resultados da combinao entre o valor 17 e 20 usando o ope-
rador OU exclusivo; o resultado 5. A quarta janela de sada mostra os resultados de tomar o complemento de um do valor
17; o resultado -18.
O programa da Figura O.7 demonstra o uso do operador de deslocamento esquerda (<<) e o operador de desloca-
mento direita (>>). O mtodo GetBits retorna uma string contendo a representao de bits de um valor inteiro passado
para ele como um argumento. Quando os usurios fornecem um inteiro em uma TextBox e pressionam Enter, o programa
exibe a representao de bits do inteiro especificado em um Label.
105 }
106
107 return output.ToString();
108
109 } // fim do mtodo GetBits
110
111 } // fim da classe BitShift
Cada operador de deslocamento tem seu prprio boto na GUI do aplicativo. Quando um usurio d um clique em
cada boto, os bits do inteiro so deslocados esquerda ou direita em um bit. TextBox e Label exibem o novo valor de
inteiro e a nova representao de bits, respectivamente.
O operador de deslocamento esquerda (<<) desloca os bits de seu operando esquerdo para a esquerda pelo nmero de
bits especificado em seu operando direito. Os bits mais direita so substitudos por 0s; os 1s deslocados para fora da esquerda
se perdem. As duas primeiras janelas de sada da Figura O.7 demonstram o operador de deslocamento esquerda. Para produ-
zir a sada, o usurio forneceu o valor 23 e deu um clique no boto de deslocamento esquerda, resultando no valor 46.
O operador de deslocamento direita (>>) muda os bits de seu operando esquerdo para a direita pelo nmero de bits
especificados em seu operando direito. Os 0s substituem os bits vagos no lado esquerdo se o nmero for positivo, e os 1s
substituem os bits vagos se o nmero for negativo. Todos os 1s deslocados para fora da extrema direita se perdem. A terceira
e a quarta janela de sada descrevem o resultado da mudana de 184 uma vez para a direita.
Cada operador bit a bit (exceto o operador de complemento bit a bit) tem um operador correspondente de atribuio.
A Figura O.8 descreve esses operadores de atribuio bit a bit, os quais so usados de modo semelhante aos operadores de
designao aritmtica apresentados no Captulo 3.
a) Cria um array com todos os elementos inicializados como 1 (verdadeiro). Os elementos de array com ndices
primos permanecem 1. Todos os outros elementos do array so eventualmente configurados como 0.
b) Comeando com o ndice de array 2 (o ndice 1 no deve ser primo), sempre que um elemento do array encon-
trado com um valor de 1 percorre o restante do array e configura como 0 cada elemento cujo ndice um mltiplo
do ndice do elemento com o valor 1. Por exemplo, para o ndice de array 2, todos os elementos aps o 2 no array
que so mltiplos de 2 so configurados como 0 (os ndices 4, 6, 8, 10 etc.); para o ndice de array 3, todos os
elementos aps 3 do array que so mltiplos de 3 so configurados como 0 (ndices 6, 9, 12, 15 etc.) e assim por
diante.
No final desse processo, os ndices dos elementos de array que so 1 so os nmeros primos. Em seguida, a lista de
nmeros primos pode ser exibida pela localizao e impresso desses ndices.
13 {
14 private System.Windows.Forms.Label promptLabel;
15
16 // o usurio fornece o inteiro
17 private System.Windows.Forms.TextBox inputTextBox;
18
19 // exibe nmeros primos
20 private System.Windows.Forms.TextBox outputTextBox;
21
22 // exibe se o inteiro da entrada primo
23 private System.Windows.Forms.Label displayLabel;
24
25 private BitArray sieve;
26
27 private System.ComponentModel.Container components = null;
28
29 // construtor padro
30 public BitArrayTest()
31 {
32 InitializeComponent();
33
34 // cria o BitArray e configura todos os bits como verdadeiro
35 sieve = new BitArray( 1024 );
36 sieve.SetAll( true );
37
38 int finalBit = ( int ) Math.Sqrt( sieve.Length );
39
40 // executa a operao de peneira
41 for ( int i = 2; i < finalBit; i++ )
42 if ( sieve.Get( i ) )
43 for ( int j = 2 * i; j < sieve.Length; j += i )
44 sieve.Set( j, false );
45
46 int counter = 0;
47
48 // exibe os nmeros primos
49 for ( int i = 2; i < sieve.Length; i++ )
50 if ( sieve.Get( i ) )
51 outputTextBox.Text += i +
52 ( ++counter % 7 == 0 ? \r\n : );
53 }
54
55 // cdigo gerado pelo Visual Studio .NET
56
57 [STAThread]
58 static void Main()
59 {
60 Application.Run( new BitArrayTest() );
61 }
62
63 private void inputTextBox_KeyDown(
64 object sender, System.Windows.Forms.KeyEventArgs e )
65 {
66 // se o usurio pressionou Enter
67 if ( e.KeyCode == Keys.Enter )
68 {
69 int number = Convert.ToInt32( inputTextBox.Text );
70
Usamos um BitArray para implementar o algoritmo. O programa exibe os nmeros primos do intervalo de 1 a 1023
em uma TextBox. O programa tambm fornece uma TextBox na qual os usurios podem digitar qualquer nmero de 1 a
1023 para determinar se aquele nmero primo (caso em que ele exibe uma mensagem indicando que o nmero primo).
A instruo da linha 35 cria um BitArray de 1024 bits. O mtodo BitArray SetAll configura todos os bits
como true na linha 36; em seguida, as linhas 41 a 44 determinam todos os nmeros primos ocorridos entre 1 e 1023. O
inteiro finalBit determina quando o algoritmo est completo.
Quando o usurio insere um nmero e pressiona Enter, a linha 73 testa se o nmero da entrada primo. Essa linha
usa o mtodo Get da classe BitArray, a qual toma um nmero e retorna o valor daquele bit no array. As linhas 74 e 76
imprimem uma resposta apropriada.
Resumo
Os computadores representam os dados internamente como seqncias de bits. Cada bit pode assumir o valor 0 ou o valor 1.
Em todos os sistemas, uma seqncia de 8 bits forma um byte a unidade de armazenamento padro de uma varivel do tipo byte.
Os outros tipos de dados exigem nmeros maiores de bytes para o armazenamento.
O operador E bit a bit configura cada bit do resultado como 1 se os bits correspondentes em ambos os operandos for 1.
O operador OU bit a bit inclusivo configura cada um dos bits do resultado como 1 se o bit correspondente de um operando (ou ambos) for 1.
O operador OU bit a bit exclusivo configura cada bit do resultado como 1 se o bit correspondente em exatamente um operando for 1.
O OU exclusivo tambm conhecido como XOR.
O operador de deslocamento esquerda (<<) desloca os bits de seu operando esquerdo para a esquerda pelo nmero de bits especifi-
cados em seu operando direito.
O-184 C# Como Programar
O operador de deslocamento direita (>>) desloca os bits de seu operando esquerdo para a direita pelo nmero de bits especificados
em seu operando direito. Se o operando esquerdo for negativo, os 1s so deslocados a partir da esquerda, enquanto se o operando
esquerdo for positivo, os 0s so deslocados a partir da esquerda.
O operador de complemento bit a bit (~) configura todos os bits 0 de seu operando como 1 no resultado e configura todos os bits 1
como 0 no resultado; esse processo tambm chamado de tomar o complemento de um do valor.
Com freqncia, o operador E bit a bit usado com um operando de mscara um valor de inteiro com bits especficos configurados
como 1. As mscaras ocultam alguns bits de um valor e selecionam outros bits.
Cada operador bit a bit (exceto o operador de complemento bit a bit) tem um operador de atribuio.
A classe BitArray facilita a criao e manipulao dos conjuntos de bits, os quais so muito usados pelos programadores para
representar um conjunto de flags booleanos. Um flag booleano uma varivel que registra determinada deciso booleana.
Os BitArrays so redimensionados dinamicamente mais bits podem ser adicionados depois que um BitArray criado. Isso
faz com que o objeto aumente para acomodar os bits adicionais.
O mtodo Set de BitArray pode alterar o valor de um bit individual ele aceita o ndice do bit a ser alterado e o valor bool para
o qual o bit deve ser mudado.
O mtodo BitArray And executa um E bit a bit entre dois BitArrays. Ele retorna o BitArray que o resultado da execuo
dessa operao. Os mtodos Or e Xor executam o OU bit a bit inclusivo e OU bit a bit exclusivo, respectivamente.
O mtodo BitArray SetAll configura todos os bits de BitArray como true.
Terminologia
& (E bit a bit) mtodo Get da classe BitArray
&= (operador bit a bit de atribuio E) mtodo Or da classe BitArray
^ (OU bit a bit exclusivo) mtodo Set da classe BitArray
| (OU bit a bit inclusivo) mtodo SetAll da classe BitArray
|= (operador de atribuio OU bit a bit inclusivo)
mtodo Xor da classe BitArray
~ (operador de complemento bit a bit)
nvel de bits e bytes
<< (operador de deslocamento esquerda)
nmero primo
<<= (operador de atribuio de deslocamento esquerda)
>> (operador de deslocamento direita) operador de atribuio bit a bit E (&=)
>>= (operador de atribuio de deslocamento direita) operador de atribuio de deslocamento direita (>>=)
ALU (Arithmetic Logic Unit unidade lgica aritmtica) operador de atribuio de deslocamento esquerda (<<=)
bit operador de atribuio OU bit a bit exclusivo (^=)
bit de ordem inferior operador de atribuio OU bit a bit inclusivo (|=)
bit de ordem superior operador de complemento bit a bit (~)
BitArrayText.cs operador de deslocamento direita (>>)
BitShfit.cs operador OU bit a bit exclusivo (^)
byte operador OU bit a bit inclusivo (|)
classe BitArray operadores de atribuio bit a bit
complemento de um (~) operadores bit a bit
conjunto de bits peneira de Erasttenes
CPU (Central Processing Unit unidade de processamento central) propriedade Length da classe BitArray
deciso booleana representao binria
E bit a bit (&) representao de bits de um inteiro
flag booleano sistema de numerao base 2
indexador BitArray sistema de numerao binrio
manipulao de bits tipo de dados primitivo byte
mscara de bits XOR (OU exclusivo)
mtodo And da classe BitArray