Pergunta

Hey! Eu estava olhando para este código em http://www.gnu.org/ software / M68HC11 / examples / primes_8c-source.html

Eu notei que em algumas situações eles usaram números hexadecimais, como na linha 134:

for (j = 1; val && j <= 0x80; j <<= 1, q++)

Agora, por que eles usam o 0x80? Eu não sou tão bom com hex mas eu achei um hex on-line para decimal e ele me deu 128 para 0x80.

Também antes da linha 134, na linha 114 que têm este:

small_n = (n & 0xffff0000) == 0;

O hexa para decimal me deu 4294901760 para esse número hexadecimal. Então, aqui nesta linha que eles estão fazendo um pouco E e comparando o resultado para 0 ??

Por que não usar apenas o número? Alguém por favor pode explicar e faça exemplos dão de outras situações.

Também tenho visto grandes linhas de código em que é apenas números hexadecimais e nunca realmente entendeu o porquê: (

Foi útil?

Solução

Em ambos os casos você cita, o padrão do número de bits é importante, não o número real.

Por exemplo, No primeiro caso, j vai ser 1, em seguida, 2, 4, 8, 16, 32, 64 e, finalmente, 128 como os avanços de ansa.

Em binário, isto é,

0000:0001, 0000:0010, 0000:0100, 0000:1000, 0001:0000, 0010:0000, 0100:0000 e 1000:0000.

Não há nenhuma opção para constantes binários em C ou C ++, mas é um pouco mais claro em Hex: 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40 e 0x80.

No segundo exemplo, o objectivo era eliminar as baixas dois bytes do valor. Assim, dado um valor de 1234567890 queremos acabar com 1234567168.
Em hexadecimal, é mais clara: começar com 0x4996:02d2, termine com 0x4996:0000

.

Outras dicas

Há um mapeamento direto entre hex (ou octal para essa matéria) dígitos e os padrões de bits subjacentes, o que não é o caso com decimal. Um decimal '9' representa diferente algo com relação a padrões de bits, dependendo de qual coluna que se encontra e quais números cercá-lo - ele não tem uma relação direta com um padrão de bits. Em hexadecimal, um '9' sempre meio '1001', não importa qual coluna. 9 = '1001', 95 = '* 1001 * 0101' e assim por diante.

Como um vestígio dos meus 8 bits dias eu encontrar hex uma abreviação conveniente para qualquer coisa binária. Bit twiddling é uma habilidade morrendo. Uma vez (cerca de 10 anos atrás) eu vi um terceiro ano de papel de rede na universidade, onde apenas 10% (5 de 50 ou mais) das pessoas na classe poderia calcular um bit-máscara.

sua máscara um pouco. valores hexadecimais torná-lo fácil de ver a representação binária subjacente. n & 0xffff0000 retorna o topo de 16 bits de n. meios 0xffff0000 "16 1s e 0s 16 em binário"

meios 0x80 "1000000", assim que você começar com "00000001" e continuar mudando de que pouco mais para a esquerda "0000010", "0000100", etc, até que "1000000"

0xffff0000 é fácil de entender que é 16 vezes "1" e 16 vezes "0" em um valor de 32 bits, enquanto 4294901760 é mágica.

Acho que é enlouquecedor que a família C de línguas sempre apoiaram octal e hexadecimal, mas não binário. Há muito que desejava que ele se adicionar suporte direto para binário:

int mask = 0b00001111;

Muitos anos / postos de trabalho atrás, enquanto trabalhava em um projeto que envolveu uma enorme quantidade de matemática em nível de bit, I got alimentado e gerado um arquivo de cabeçalho que continham definido constantes para todos os valores binários possíveis até 8 bits:

#define b0        (0x00)
#define b1        (0x01)
#define b00       (0x00)
#define b01       (0x01)
#define b10       (0x02)
#define b11       (0x03)
#define b000      (0x00)
#define b001      (0x01)
...
#define b11111110 (0xFE)
#define b11111111 (0xFF)

Tem ocasionalmente fez certo código de nível pouco mais legível.

Às vezes, a representação visual de valores em HEX torna o código mais legível ou compreensível. Por exemplo bitmasking ou o uso de bits se torna não-óbvio quando se olha para representações decimais de números.

Isto pode, por vezes, ver com a quantidade de espaço que um tipo de valor particular tem para oferecer, de modo que pode também desempenhar um papel.

Um exemplo típico pode estar em uma configuração binária, por isso em vez de usar decimal para mostrar alguns valores, usamos binário.

digamos um objeto tinha um conjunto não-exclusiva de propriedades que tinham valores de ligado ou desligado (3 deles) - uma maneira de representar o estado dessas propriedades é com 3 bits.

representações válidos são de 0 a 7 em decimal, mas isso não é tão óbvio. mais óbvia é a representação binária:

000, 001, 010, 011, 100, 101, 110, 111

Além disso, algumas pessoas são apenas muito confortável com hex. Note também que os números mágicos codificados são apenas isso e não é assim tão importante sistema de numeração não importa para uso

Espero que ajuda.

Geralmente o uso de números hexadecimais em vez de Decimal é porque o computador trabalha com bits (números binários) e quando você está trabalhando com os bits também é mais compreensível para usar números hexadecimais, porque é mais fácil ir de Hex para binário que a partir de decimal para binário.

OxFF = 1111 1111 ( F = 1111 )

e

255 = 1111 1111 

porque

255 / 2 = 127 (rest 1)
127 / 2 = 63 (rest 1)
63 / 2 = 31 (rest 1)
... etc

Você pode ver isso? É muito mais simples para passar de Hex para binário.

O único grande uso de hex é, provavelmente, na programação incorporado. números hexadecimais são utilizados para mascarar bits individuais em registos de hardware, ou dividir vários valores numéricos embalados num único 8, 16, ou 32 bits registo.

Ao especificar máscaras de bits individuais, um monte de gente começar por:

#define bit_0 1
#define bit_1 2
#define bit_2 4
#define bit_3 8
#define bit_4 16
etc...

Depois de um tempo, eles avançam para:

#define bit_0 0x01
#define bit_1 0x02
#define bit_2 0x04
#define bit_3 0x08
#define bit_4 0x10
etc...

Em seguida, eles aprendem a fazer batota, e deixar que o compilador gerar os valores como parte de otimização de tempo de compilação:

#define bit_0 (1<<0)
#define bit_1 (1<<1)
#define bit_2 (1<<2)
#define bit_3 (1<<3)
#define bit_4 (1<<4)
etc...

Existem 8 bits em um byte. Hex, a base 16, é concisa. Qualquer valor de byte possível é expresso usando dois caracteres a partir da colecção 0..9, além de a, b, c, d, e, f.

Base de 256 seria mais concisa. Cada possível byte pode ter o seu próprio carácter único, mas a maioria das linguagens humanas não usar 256 caracteres, de modo Hex é o vencedor.

Para entender a importância de ser concisa, considere que volta na década de 1970, quando quis examinar a sua megabyte de memória, foi impresso em hexadecimal. A impressão usaria vários milhares de páginas de grande papel. Octal teria perdido ainda mais árvores.

Para ser mais preciso, hex e decimal, são todos os números. O radix (base de 10, 16, etc.) são formas de apresentar esses números de uma maneira que seja mais claro, ou mais conveniente.

Quando se discute "quantos de algo há" normalmente usamos decimal. Quando estamos olhando para endereços ou padrões de bits em computadores, hex é geralmente preferido, porque muitas vezes o significado de bytes individuais pode ser importante.

Hex, (e octal) têm a propriedade de que são potências de dois, então eles mapear grupos de bit bem. Hex mapeia 4 bits para uma mordidela hex (0-F), de modo que um byte é armazenada em dois nibbles (00-FF). Octal era popular na Digital Equipment (DEC) e outras máquinas mais antigas, mas um dígito octal mapeia para três bits, por isso faz limites de byte não cruz como muito bem.

No geral, a escolha de Radix é uma maneira de fazer a sua programação mais fácil -. Usar o que corresponde ao domínio melhor

Hex, ou hexadecimal, representam números de 4 bits de dados, de 0 a 15 ou em HEX 0 a valores F. Dois hex representar um byte.

Olhando para o arquivo, que é um código muito groady. Espero que você é bom em C e não usá-lo como um tutorial ...

Hex é útil quando você está trabalhando diretamente no nível bit ou apenas acima dela. Por exemplo, trabalhando em um driver onde você está olhando diretamente para os bits vindos de um dispositivo e girando os resultados para que outra pessoa pode ler um resultado coerente. É um compacto bastante fácil de ler representação de binário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top