Manipulação de Bits

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

boolean?

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… =)

Podia dizer como seria esse processo “escovar”?

Escovar seria como manipular. Mexer diretamente com os bits.

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

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

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.

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.