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