Você está na página 1de 15

O

MANIPULAO DE BITS

OBJETIVOS

Entender o conceito da manipulao de bits.


Poder usar os operadores bit a bit.
Poder usar a classe BitArray para executar a
manipulao de bits.
Apndice O Manipulao de Bits O-171

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.2 A manipulao de bits e os operadores bit a bit


O C# fornece capacidades extensas de manipulao de bits para os programadores que precisam trabalhar no nvel de bits
e bytes. Os sistemas operacionais, o software de equipamentos de teste, o software de rede e muitos outros tipos de aplica-
tivos exigem que os programadores se comuniquem diretamente com o hardware. Nesta e na prxima seo discutiremos
as capacidades de manipulao do C#. Aps apresentar os operadores bit a bit de C#, demonstraremos o uso dos operadores
em exemplos de cdigo vivo.
Os computadores representam os dados internamente como seqncias de bits. As ALUs (Arithmetic Logic Units
unidades lgico-aritmticas), as CPUs (Central Processing Units unidades de processamento central) e outros elemen-
tos de um computador processam os dados como bits ou grupos de bits. Cada bit pode assumir o valor 0 ou 1. Em todos os
sistemas, uma seqncia de oito bits forma um byte a unidade padro de armazenamento de uma varivel do tipo byte.
Os outros tipos de dados exigem nmeros maiores de bytes para o armazenamento. Os operadores bit a bit manipulam os bits
de operandos inteiros (ou seja, sbyte, byte, char, short, ushort, int, uint, long e ulong).
Observe que a discusso sobre os operadores bit a bit desta seo ilustra as representaes binrias dos operandos intei-
ros. Para obter uma explicao detalhada do sistema de numerao binrio (tambm chamado base 2) consulte o Apndice B.
Os operadores E bit a bit (&), OU bit a bit inclusivo (|) e OU bit a bit exclusivo (^) operam de modo semelhante aos
seus equivalentes lgicos, exceto que as verses de bit a bit operam no nvel de bits. O operador E bit a bit configura cada bit
do resultado como 1, se o bit correspondente de ambos os operandos for 1 (Figura O.2). O operador OU bit a bit inclusivo
configura cada bit do resultado como 1, se o bit correspondente de um ou ambos os operadores for 1 (Figura O.3). O opera-
dor OU bit a bit exclusivo configura cada bit do resultado como 1, se o bit correspondente exatamente de um operando for 1
(Figura O.4). 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 especificado em seu operando direito. 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, mas se o operando for positivo, os 0s so deslocados a partir da esquerda. O operador
bit a bit de complemento (~) configura todos os bits 0 de seu operando como 1 e todos os bits 1 como 0 no resultado; esse
processo s vezes chamado de tomar o complemento de um do valor. Uma discusso detalhada sobre cada operador bit a
bit vir nos prximos exemplos. Os operadores bit a bit e suas funes esto resumidos na Figura O.1.
Ao usar os operadores bit a bit, bom exibir os valores em suas representaes binrias para ilustrar os efeitos desses
operadores. Na Figura O.5, os inteiros so exibidos em suas representaes binrias como grupos de oito bits cada um. O
mtodo GetBits (linhas 67 a 91) da classe PrintBits usa o operador E bit a bit (linha 79) para combinar a varivel num-
ber com a varivel displayMask. Quase sempre, o operador E bit a bit usado com um operando de mscara um valor
inteiro com bits especficos configurados como 1. As mscaras ocultam alguns bits em um valor e selecionam outros bits.
GetBits atribui varivel de mscara displayMask o valor 1 << 31 (10000000 00000000 00000000 00000000).
O-172 C# Como Programar

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

Operador Nome Descrio

& 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.

Figura O.1 Operadores de bit a bit.

Bit 1 Bit 2 Bit 1 & Bit 2

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 (&).

Bit 1 Bit 2 Bit 1 | Bit 2

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 (|).

Bit 1 Bit 2 Bit 1 ^ Bit 2

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.

1 // Fig. O.5: PrintBits.cs


2 // Imprimindo os bits que constituem um inteiro.
3
4 using System;
5 using System.Drawing;
6 using System.Collections;
7 using System.ComponentModel;
8 using System.Windows.Forms;
9 using System.Data;
10 using System.Text;
11
12
13 // exibe a representao de bits da entrada do usurio
14 public class PrintBits : System.Windows.Forms.Form
15 {
16 private System.Windows.Forms.Label promptLabel;
17 private System.Windows.Forms.Label viewLabel;
18
19 // para a entrada de usurio
20 private System.Windows.Forms.TextBox inputTextBox;
21
22 // a representao de bits exibida aqui
23 private System.Windows.Forms.Label displayLabel;
24
25 private System.ComponentModel.Container components = null;
26
27 // construtor padro
28 public PrintBits()
29 {
30 InitializeComponent();
31 }
32
33 // cdigo gerado pelo Visual Studio .NET
34
35 [STAThread]
36 static void Main()
37 {
38 Application.Run( new PrintBits() );
39 }
40
41 // processa o inteiro quando o usurio pressiona Enter
42 private void inputTextBox_KeyDown(
43 object sender, System.Windows.Forms.KeyEventArgs e )
44 {
45 // se o usurio pressionou Enter
46 if ( e.KeyCode == Keys.Enter )
47 {
48 // testa se o usurio inseriu um inteiro
49 try
Figura O.5 Exibindo a representao de bits de um inteiro. (Parte 1 de 2.)
O-174 C# Como Programar

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

Figura O.5 Exibindo a representao de bits de um inteiro. (Parte 2 de 2.)

Erro de programao comum O.1


O uso do operador E lgico (&&) no lugar do operador E bit a bit (&) um erro de programao comum.

Erro de programao comum O.2


O uso do operador OU lgico (||) no lugar do operador OU bit a bit inclusivo (|) um erro comum de programao.
Apndice O Manipulao de Bits O-175

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.

1 // Fig. O.6: BitOperations.cs


2 // Uma classe que demonstra diversas operaes de bits
3
4 using System;
5 using System.Drawing;
6 using System.Collections;
7 using System.ComponentModel;
8 using System.Windows.Forms;
9 using System.Data;
10 using System.Text;
11
12 // permite que o usurio teste os operadores de bits
13 public class BitOperations : System.Windows.Forms.Form
14 {
15 private System.Windows.Forms.Label promptLabel;
16 private System.Windows.Forms.Label representationLabel;
17 private System.Windows.Forms.Label value1Label;
18 private System.Windows.Forms.Label value2Label;
19 private System.Windows.Forms.Label resultLabel;
20
21 // exibe as representaes de bits
22 private System.Windows.Forms.Label bit1Label;
23 private System.Windows.Forms.Label bit2Label;
24 private System.Windows.Forms.Label resultBitLabel;
25
26 // permite que o usurio execute as operaes de bits
27 private System.Windows.Forms.Button andButton;
28 private System.Windows.Forms.Button inclusiveOrButton;
29 private System.Windows.Forms.Button exclusiveOrButton;
30 private System.Windows.Forms.Button complementButton;
31
32 // o usurio fornece dois inteiros
33 private System.Windows.Forms.TextBox bit1TextBox;
34 private System.Windows.Forms.TextBox bit2TextBox;
35
36 private System.Windows.Forms.TextBox resultTextBox;
37
38 private int value1, value2;
39
40 private System.ComponentModel.Container components = null;
41
42 // construtor padro
43 public BitOperations()
44 {
45 InitializeComponent();
46 }
47
48 // cdigo gerado pelo Visual Studio .NET
49
50 [STAThread]
51 static void Main()
52 {
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 1 de 3.)
O-176 C# Como Programar

53 Application.Run( new BitOperations() );


54 }
55
56 // E
57 private void andButton_Click(
58 object sender, System.EventArgs e )
59 {
60 SetFields();
61
62 // atualiza resultTextBox
63 resultTextBox.Text =
64 string.Format( {0}, value1 & value2 );
65
66 resultBitLabel.Text = GetBits( value1 & value2 );
67 }
68
69 // OU inclusivo
70 private void inclusiveOrButton_Click(
71 object sender, System.EventArgs e )
72 {
73 SetFields();
74
75 // atualiza resultTextBox
76 resultTextBox.Text =
77 string.Format( {0}, value1 | value2 );
78 resultBitLabel.Text = GetBits( value1 | value2 );
79 }
80
81 //OU exclusivo
82 private void exclusiveOrButton_Click(
83 object sender, System.EventArgs e )
84 {
85 SetFields();
86
87 // atualiza resultTextBox
88 resultTextBox.Text =
89 string.Format( {0}, value1 ^ value2 );
90 resultBitLabel.Text = GetBits( value1 ^ value2 );
91 }
92
93 // complemento do primeiro inteiro
94 private void complementButton_Click(
95 object sender, System.EventArgs e )
96 {
97 value1 = Convert.ToInt32( bit1TextBox.Text );
98 bit1Label.Text = GetBits( value1 );
99
100 // atualiza resultTextBox
101 resultTextBox.Text = string.Format( {0}, ~value1 );
102 resultBitLabel.Text = GetBits( ~value1 );
103 }
104
105 // converte o inteiro em sua representao de bits
106 private string GetBits( int number )
107 {
108 int displayMask = 1 << 31;
109

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

110 StringBuilder output = new StringBuilder();


111
112 // obtm cada bit, inclui espao a cada 8 bits
113 // para a formatao da exibio
114 for ( int c = 1; c <= 32; c++ )
115 {
116 // anexa 0 ou 1 dependendo do resultado da mscara
117 output.Append(
118 ( number & displayMask ) == 0 ? 0 : 1 );
119
120 // muda esquerda para que a mscara encontre o bit do
121 // prximo dgito da prxima iterao do lao
122 number <<= 1;
123
124 if ( c % 8 == 0 )
125 output.Append( );
126 }
127
128 return output.ToString();
129
130 } // fim do mtodo GetBits
131
132 // define os campos do formulrio
133 private void SetFields()
134 {
135 // recupera os valores de entrada
136 value1 = Convert.ToInt32( bit1TextBox.Text );
137 value2 = Convert.ToInt32( bit2TextBox.Text );
138
139 // define os rtulos para exibir as representaes de bit dos inteiros
140 bit1Label.Text = GetBits( value1 );
141 bit2Label.Text = GetBits( value2 );
142 }
143
144 } // fim da classe BitOperations

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.

1 // Fig. O.7: Deslocamento de bits.cs


2 // Demonstra os operadores de deslocamento de bits.
3
4 using System;
5 using System.Drawing;
6 using System.Collections;
7 using System.ComponentModel;
8 using System.Windows.Forms;
9 using System.Data;
10 using System.Text;
11
12 // desloca os bits direita ou esquerda
13 public class Deslocamento de bits : System.Windows.Forms.Form
14 {
15 private System.Windows.Forms.Label inputLabel;
16
17 // aceita a entrada de usurio
18 private System.Windows.Forms.TextBox inputTextBox;
19
20 // exibe o inteiro em bits
21 private System.Windows.Forms.Label displayLabel;
22 private System.Windows.Forms.Button rightButton;
23 private System.Windows.Forms.Button leftButton;
24
25 private System.ComponentModel.Container components = null;
26
27 // construtor padro
28 public Deslocamento de bits()
29 {
30 InitializeComponent();
31 }
32
33 // cdigo gerado pelo Visual Studio .NET
34
35 [STAThread]
36 static void Main()
37 {
38 Application.Run( new Deslocamento de bits() );
39 }
40
41 // processa a entrada de usurio
42 private void inputTextBox_KeyDown(
43 object sender, System.Windows.Forms.KeyEventArgs e )
44 {
45 if ( e.KeyCode == Keys.Enter )
46 displayLabel.Text =

Figura O.7 Usando os operadores de deslocamento de bits. (Parte 1 de 3.)


Apndice O Manipulao de Bits O-179

47 GetBits( Convert.ToInt32( inputTextBox.Text ) );


48 }
49
50 // realiza o deslocamento esquerda
51 private void leftButton_Click(
52 object sender, System.EventArgs e )
53 {
54 // recupera a entrada de usurio
55 int number = Convert.ToInt32( inputTextBox.Text );
56
57 // realiza a operao de deslocamento esquerda
58 number <<= 1;
59
60 // converte para inteiro e exibe na caixa de texto
61 inputTextBox.Text = number.ToString();
62
63 // exibe os bits no rtulo
64 displayLabel.Text = GetBits( number );
65 }
66
67 // faz o deslocamento direita
68 private void rightButton_Click(
69 object sender, System.EventArgs e )
70 {
71 // recupera a entrada de usurio
72 int number = Convert.ToInt32( inputTextBox.Text );
73
74 // faz a operao de deslocamento direita
75 number >>= 1;
76
77 // converte para inteiro e exibe na caixa de texto
78 inputTextBox.Text = number.ToString();
79
80 // exibe os bits no rtulo
81 displayLabel.Text = GetBits( number );
82 }
83
84 // converte o inteiro em sua representao de bit
85 private string GetBits( int number )
86 {
87 int displayMask = 1 << 31;
88
89 StringBuilder output = new StringBuilder();
90
91 // obtm cada bit, adiciona um espao a cada 8 bits
92 // para exibio formatada
93 for ( int c = 1; c <= 32; c++ )
94 {
95 // anexa um 0 ou 1 dependendo do resultado da mscara
96 output.Append(
97 ( number & displayMask ) == 0 ? 0 : 1 );
98
99 // desloca esquerda para que a mscara encontre o bit do
100 // prximo dgito durante a prxima iterao do lao
101 number <<= 1;
102
103 if ( c % 8 == 0 )
104 output.Append( );

Figura O.7 Usando os operadores de deslocamento de bits. (Parte 2 de 3.)


O-180 C# Como Programar

105 }
106
107 return output.ToString();
108
109 } // fim do mtodo GetBits
110
111 } // fim da classe BitShift

Figura O.7 Usando os operadores de deslocamento de bits. (Parte 3 de 3.)

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.

Operadores de atribuio bit a bit

&= Operador de atribuio E bit a bit.


|= Operador de atribuio OU bit a bit inclusivo.
Figura O.8 Operadores de atribuio bit a bit. (Parte 1 de 2.)
Apndice O Manipulao de Bits O-181

Operadores de atribuio bit a bit

^= Operador de atribuio OU bit a bit exclusivo.


<<= Operador de atribuio de deslocamento esquerda.
>>= Operador de atribuio de deslocamento direita.
Figura O.8 Operadores de atribuio bit a bit. (Parte 2 de 2.)

O.3 A Classe BitArray


A classe BitArray facilita a criao e a manipulao de conjuntos de bits, os quais so muito usados pelos programadores
para representar um conjunto de flags booleanos. Um flag booleano uma varivel que registra uma determinada deciso
booleana. Os BitArrays so redimensionveis dinamicamente mais bits podem ser includos depois que um objeto
BitArray criado. Isso faz com que o objeto aumente para acomodar os bits adicionais.
A classe BitArray fornece diversos construtores, um dos quais aceita um int como um argumento. O int especi-
fica o nmero de bits que BitArray representa. Todos eles so definidos inicialmente como false.
O mtodo Set de BitArray pode mudar o valor de um bit individual; ele aceita o ndice do bit a ser alterado e seu
novo valor bool. A classe BitArray tambm inclui um indexador que permite obter e configurar os valores individuais
de bit. O indexador retorna true se o bit especificado estiver ligado (ou seja, o bit tiver o valor 1) e retorna false, caso
contrrio (ou seja, o bit tem o valor 0 ou desligado).
O mtodo And da classe BitArray executa um E bit a bit entre dois BitArrays e retorna o resultado de BitArray
da operao. Os mtodos Or e Xor executam as operaes OU bit a bit inclusivo e OU bit a bit exclusivo, respectivamente.
A classe BitArray tambm fornece uma propriedade Length, a qual retorna o nmero de elementos do BitArray.
A Figura O.9 implementa a peneira de Erasttenes, que consiste em uma tcnica para localizar nmeros primos. Um
nmero primo um inteiro divisvel apenas por si mesmo e por 1. A peneira de Erasttenes opera desta maneira:

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.

1 // Fig. O.9: BitArrayTest.cs


2 // Demonstra a classe BitArray.
3
4 using System;
5 using System.Drawing;
6 using System.Collections;
7 using System.ComponentModel;
8 using System.Windows.Forms;
9 using System.Data;
10
11 // implementa a peneira de Erasttenes
12 public class BitArrayTest : System.Windows.Forms.Form

Figura O.9 Peneira de Erasttenes. (Parte 1 de 3.)


O-182 C# Como Programar

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

Figura O.9 Peneira de Erasttenes. (Parte 2 de 3.)


Apndice O Manipulao de Bits O-183

71 // se a peneira verdadeira no ndice do inteiro


72 // fornecido pelo usurio, ento o nmero primo
73 if ( sieve.Get( number ) )
74 displayLabel.Text = number + is a prime number;
75 else
76 displayLabel.Text =
77 number + is not a prime number;
78 }
79 } // fim do mtodo inputTextBox_KeyDown
80
81 } // fim da classe BitArrayTest

Figura O.9 Peneira de Erasttenes. (Parte 3 de 3.)

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

Você também pode gostar