2010-08-09 22 views
2

Je regarde le code source original pour Identicons. Il y a un peu de code qui fait un peu peu tripotant pour extraire les composants rouge, vert et bleu:Différences entre 0x01 et 0x01f

int blue = (code >> 16) & 0x01f; 
int green = (code >> 21) & 0x01f; 
int red = (code >> 27) & 0x01f; 

La variable de code est un entier de 32 bits.

Ma question est la suivante: Quelle est la différence entre le nombre 0x01 et 0x01f?

Je suppose que le f signifie que la valeur est un flottant, mais pourquoi en faire un flottant? Est-ce que la représentation flottante en binaire est différente de la représentation en nombres entiers? Cela ne causerait-il pas des problèmes pour des raisons de portabilité lors du portage si un langage particulier n'utilise pas la même représentation?

En outre, je suis probablement en train de lire ce problème parce que je ne comprends pas le problème 0x01f, mais n'est-ce pas en réglant les représentations rouge, verte et bleue sur 0 ou 1, selon le bit le moins significatif?

+0

Bien sûr, c'était stupide de ma part. Mon cerveau n'a pas démarré aujourd'hui apparemment. Donc par ce code, les données RVB seraient une valeur RVB de 16 bits de 565. Mais le composant vert de la couleur n'utilise que 5 de ses 6 bits. Cela signifie-t-il que le code Identicon n'utilise pas la quantité totale de bits fournis dans le hachage, l'adresse IP, etc.? – Brad

+1

Que sont les Identicons de toute façon? Des cousins ​​lointains des Decepticons? – NullUserException

+1

Les identicons sont les images qui sont assignées à votre profil StackOverflow (comme cet identicon rose et blanc que mon flair a là haut). Ils sont créés sur la base d'un entier unique pour identifier de façon unique un utilisateur. Par exemple, si je publiais anonymement et qu'une image était attachée à chaque message que je publiais, personne ne pouvait prétendre qu'ils étaient moi (car ils auraient une adresse IP différente et une image différente). peut l'utiliser pour beaucoup de choses, IP, hachages de fichiers, etc. Il permet aux humains d'interpréter rapidement si une image donnée correspond à un hachage particulier, sans regarder un nombre codé en hexadécimal. – Brad

Répondre

9

Cela n'a rien à voir avec les flotteurs. C'est un masque de bits.

0x01f = 0b11111 

Lorsque vous & votre numéro avec, il efface tous les bits à gauche du 5ème bit de la droite.

Voilà comment 0x0a2bfb & 0x01f => 0x00001b:

0x0a2bfb : 0000 1010 0010 1011 1111 1011 
0x01f : 0000 0000 0000 0000 0001 1111 & 
---------------------------------------- 
result : 0000 0000 0000 0000 0001 1011 
2

f dans le contexte de hexadécimal est pas un flotteur. 0xf est équivalent à la décimale 15.

Dans votre exemple, le code est de trouver les moins significatifs 5 bits du code de couleur, probablement dans un espace de couleur 15 ou 16bit

3

Je ne suis pas sûr de Java, mais C99, flotte hexagonale really do exist, et ils ressemblent à ceci:

0x50.1p3 

le suffixe p est obligatoire (et est utilisé pour indiquer la puissance de 2 à augmenter le nombre). Par conséquent, il n'y a pas d'ambiguïté avec des littéraux hexadécimaux comme 0x01f. Le compilateur ne confondra pas f pour un suffixe constant à virgule flottante, il le lira comme un nombre hexadécimal.

+2

Cela fonctionne également en Java (à ma grande surprise - appris quelque chose de nouveau!), 0x50.1p3 est égal à 640.5. – Jesper