Tentar responder à pergunta explícita (o que é CHAR_BIT) e à pergunta implícita (como isso funciona) na pergunta original.
Um caractere em C e C ++ representa a menor unidade de memória que o programa C pode endereçar *
CHAR_BIT em C e C ++ representa o número de bits em um caractere. Deve ser sempre pelo menos 8 devido a outros requisitos do tipo char. Na prática, em todos os computadores modernos de uso geral é exatamente 8, mas alguns sistemas históricos ou especializados podem ter valores mais altos.
Java não tem equivalente a CHAR_BIT ou sizeof, não há necessidade disso, pois todos os tipos primitivos em Java têm tamanho fixo e a estrutura interna dos objetos é opaca para o programador. Se traduzir este código para Java, você pode simplesmente substituir "sizeof (int) * CHAR_BIT - 1" pelo valor fixo 31.
Neste código específico, ele está sendo usado para calcular o número de bits em um int. Esteja ciente de que esse cálculo pressupõe que o tipo int não contém bits de preenchimento.
Supondo que seu compilador escolha estender o sinal em deslocamentos de bits de números com sinal e supondo que seu sistema use a representação de complemento de 2s para números negativos, isso significa que "MASK" será 0 para um valor positivo ou zero e -1 para um valor negativo.
Para negar um número de complemento de dois, precisamos executar um não bit a bit e depois adicionar um. Podemos igualmente subtrair um e negá-lo aos bits.
Novamente, assumindo que a representação de complemento de dois -1 é representada por todos os uns, então exclusivo ou com -1 é equivalente à negação bit a bit.
Portanto, quando v é zero, o número é deixado sozinho; quando v é um, ele é negado.
Algo para se estar ciente é que o estouro assinado em C e C ++ é um comportamento indefinido. Portanto, usar esta implementação do ABS no valor mais negativo leva a um comportamento indefinido. Isso pode ser corrigido adicionando-se casts de forma que a linha final do programa seja avaliada em unsigned int.
* Que geralmente é, mas não necessariamente a mesma, que a menor unidade de memória que o hardware pode endereçar. Uma implementação pode potencialmente combinar várias unidades de memória endereçável por hardware em uma unidade de memória endereçável por programa ou dividir uma unidade de memória endereçável por hardware em várias unidades de memória endereçável por programa.