Manipulação de Bits

8 respostas
G

Olá amigos, para um trabalho universitário que estou fazendo tenho a necessidade de “escovar” bits.

É possível declarar uma variável que ocupe 1 bit na memória?

Usando-se o tipo byte para representar uma cadeia de 8 bits, como eu poderia “pegar” um desses bits do byte para poder trabalhar com ele?

Quais são as operações disponíveis para o tipo byte?

Usando-se o tipo byte eu creio que saberia como MODIFICAR um dos bits do byte, usando operações AND e OR com outros bytes. Mas e como pegar um dos bits desse byte?

Desde já agradeço qualquer ajuda. =)

8 Respostas

G

boolean?

G

Não. O tamanho do tipo boolean na memória varia dependendo do sistema em que a aplicação está sendo rodada. Pode ser de 1 bit, como pode ser de 1 byte, ou 4 bytes por exemplo.

Eu creio que o tipo byte ocupe sempre 8 bits, independente do sistema em que a aplicação está sendo rodada, o que funcionaria para o meu caso, que é manipular bits que realmente ocupem o espaço de 1 bit na memória.

Aguardando ajuda… =)

Giovanni_Ritchie

Podia dizer como seria esse processo “escovar”?

G

Escovar seria como manipular. Mexer diretamente com os bits.

ViniGodoy

Eu normalmente uso ints inteiros. Se você quiser, pode usar variável do tipo byte também, mas lembre-se que ela tem sinal.

Para trabalhar com bits individuais, use os operadores bitwise e os bitshift.

Ou seja, o operador E &, OU |, XOR ^, e NOT ~.
E os operadores de shift left >> e shift right <<.

As operações de shift "empurram" um bit da sequencia para a esquerda ou para direita.

Por exemplo:

int x = 13; //Em binário: 1101 x = x << 2; //Novo valor binário: 110100

O operador & pode ser usado como máscara, para isolar bits. Por exemplo, suponha que você queira separar o terceiro bit da variável x, do programa acima. Você poderia fazer:

int mask = 4; //Em binário 100 bool bit = (x & 4) == 4;

Explicando a operação acima. Você vai pegar o número:
110100 &
000100

000100

Note que só há uma forma daquele bit 1 permanecer ligado. É se ele já estiver ligado em x.

Existe uma classe em Java, chamada BitSet, que representa um array de bits de tamanho indefinido. Também pode ser uma boa idéia utiliza-la:
http://download.oracle.com/javase/6/docs/api/java/util/BitSet.html

ViniGodoy

PS: Se quiser ver um exemplo de manipulação nervosa de bits, dê uma olhada nesse tópico sobre esteganografia, onde ensino e esconder um arquivo inteiro zipado nos bits de cor de uma imagem: http://www.guj.com.br/java/221679-voltar-de-valor-byte-para-letra-resolvido#1134695

PPS: Se quiser ver um exemplo mais light, dá uma olhada nesse artigo do Ponto V:
http://www.pontov.com.br/site/index.php/arquitetura/51-programacao/186-imagens-digitais

johnny_quest

Em java não existe um primitivo direto para bit.
Numa modelagem do meu TCC eu usei a classe BitSet.
Ela tem os métodos de And, or, not e vários outros métodos
bons.

Mas mesmo assim essa classe tem algumas limitações, e em muitos casos
é preciso herda-la e criar o comportamente que queira.

ViniGodoy

Na verdade, não conheço nenhuma linguagem que tenha.
Até porque um registrador normalmente é do tamanho de um inteiro.

Não é à toa que você fala que seu sistema operacional é de “32-bits” ou “64-bits”. Isso é o número de bits que o processador consegue processar em um único ciclo de clock. Qualquer variável menor que isso seria um desperdício.

Por isso também recomendam o uso de int no lugar de byte e short, quando vc precisa fazer otimizações de performance num nível muito baixo.

Criado 10 de março de 2011
Ultima resposta 11 de mar. de 2011
Respostas 8
Participantes 5