Citar o código para calcular o valor absoluto inteiro (abs) sem desviar de http://graphics.stanford.edu/~seander/bithacks.html :
int v; // we want to find the absolute value of v
unsigned int r; // the result goes here
int const mask = v >> sizeof(int) * CHAR_BIT - 1;
r = (v + mask) ^ mask;
Variação patenteada:
r = (v ^ mask) - mask;
O que é CHAR_BIT
e como usar?
c
bit-manipulation
dato datuashvili
fonte
fonte
CHAR_BIT
?" , mesmo que essa não fosse a pergunta original. :( Dada a sua explicação, entendo por que você escreveu esta resposta, mas para a posteridade pode ser mais útil (a) remover sua resposta e reescrevê-la como um comentário para a pergunta, de modo que @AaraK apareça no topo, ou (b) edite sua resposta para que responda ao título atual da pergunta.CHAR_BIT
é o número de bits emchar
. Atualmente, quase todas as arquiteturas usam 8 bits por byte, mas nem sempre é o caso. Algumas máquinas mais antigas costumavam ter bytes de 7 bits.Ele pode ser encontrado em
<limits.h>
.fonte
CHAR_BIT>=8
e permite valores muito maiores para DSPs que têm apenas um único tamanho de tipo, geralmente 32 bits. POSIX requerCHAR_BIT==8
. Em geral, você pode assumir qualquer arquitetura orientada para servidor multiusuário / multitarefa ou orientada para uso interativo com qualquer chance de estar conectado à Internet ou de intercambiar dados textuais com o mundo externoCHAR_BIT==8
.int8_t
euint8_t
existam. Portanto, existe um tipo de largura 8. Uma vez quesizeof
qualquer tipo deve ser compatível com,sizeof char
na verdadesizeof int8_t
deve ser 1. PortantoCHAR_BIT == 8
. Escrevi algo sobre essa obeservação aqui: gustedt.wordpress.com/2010/06/01/how-many-bits-has-a-bytestdint.h
. Portanto, é necessário, e também é marcado como extensão do padrão ISO C , sem se referir a uma versão particular desse padrão. Foi mal.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.
fonte