Em Java, assim como em outras linguagens, podemos manipular os bits armazenados nas variáveis. Esse tipo de abordagem é importante quando queremos que nosso programa realize operações da forma mais eficiente possível.
Operações matemáticas podem ser realizadas utilizando os chamados operadores bit-a-bit. Com estes operadores, nós de fato manipulamos cada um do conjunto de bits que representam um dado valor.

Para exemplificar, vamos analisar a forma como Java trata variáveis do tipo char: Um variável declarda como char, é na verdade um inteiro que vai de 0 a 65538, ou seja, 2^16. Por possuir apenas 16 bits, uma variável do tipo char só pode armazenar caracteres da tabela ASCII. Por exemplo:
char a = 65; // 65 é o código ASCII para o caractere 'A'
char b = 66; // 66 é o código ASCII para o caractere 'B'
As representações binárias dos valores 65 e 66 são respectivamente 10000001 e 10000010.

Dicas e truques:

1) Verificando a paridade de um número
Podemos proceder da forma convencional e verificar se o resto da divisão de um número por 2 é zero ou um. Caso o resto seja zero, o número é par, caso contrário, o número é ímpar.
int n = 10;
boolean isEven(int n){
  return (n % 2) == 0;
}
Um forma mais eficiente de verificar a paridade de um número é através do operador &. Sabendo que em números pares o bit menos significativo é zero e em números ímpares é um, podemos saber a paridade do número fazendo:
int n = 10; // 1010 é a representação binária do número 10
boolean isEven(int n){
  return (n & 1) == 0;
}
Ou seja, n & 1 faz a operação 1010 & 1, como 0 & 1 é igual a zero, sabemos que o número é par.

2) Multiplicando um número por 2
Para dobrar o valor de uma variável, podemos usar o operador << (left-shift) e deslocar todos os bits uma posição para a esquerda. Ou seja:
int n = 11;
n = n << 1; // n agora vale 22 

3) Dividindo um número por 2
Para dividir por 2 o valor armazenado em uma variável, podemos usar o operador >> (right-shift)
int n = 10;
n = n >> 1; // n agora vale 5
4) Testando bits
Podemos verificar cada um dos bits que fazem parte da representação binária de um número. Para isso, usamos uma máscara, que inicialmente será 1. Voltando ao exemplo da variável char, vamos verificar quantos bits são iguais a 1 na representação binária do caractere 'A'.
char a = 'A';
char mask = 1;
int n = 0; // armazena a quantidade de 1's encontrados na representação binária 
while(a > 0){
  if(a & mask == 1)
    n++;
  a = (char) (a >> 1);
}
Em breve traremos mais exemplos de manipulação de bits. Continuem acompanhando nosso blog.
Para uma abordagem mais teórica sobre a conversão de números entre bases numéricas acessem o InductionCode e confiram os posts clicando aqui.
@Ojavaman