2009-11-09 5 views
3

J'essaie de résoudre une énigme dans un test de programmation. Clause de non-responsabilité: C'est un test pour un emploi, mais je ne cherche pas de réponse. Je cherche juste à comprendre comment faire cela. Le test nécessite que je propose un ensemble de solutions à un ensemble de problèmes dans un délai de deux semaines, et qu'il ne soit pas nécessaire d'arriver à isoler les solutions.Extraction de nombres à partir d'un entier de 32 bits

Ainsi, le problème:

J'ai un nombre de 32 bits avec les bits disposés comme ceci:

siiiiiii iiiiiiii ifffffff ffffffff 

Où:

  • s est le bit de signe (1 = = négatif)
  • i est 16 bits entiers
  • f est 15 bits de fraction

L'affectation consiste à écrire quelque chose qui décode un nombre entier de 32 bits en un nombre à virgule flottante. Compte tenu des entrées suivantes, il devrait produire les résultats suivants:

input   output 

0x00008000 1.0 
0x80008000 -1.0 
0x00010000 2.0 
0x80014000 -2.5 
0x000191eb 3.14 
0x00327eb8 100.99 

Je ne pas avoir du mal à obtenir le bit de signe ou la partie entière du nombre. Je reçois le bit de signe comme ceci:

boolean signed = ((value & (1 << 31)) != 0); 

je reçois les parties entières et fractions comme ceci:

int wholePart = ((value & 0x0FFFFFFF) >> 15); 

int fractionPart = ((value & 0x0000FFFF >> 1)); 

La partie que je vais avoir un problème avec est d'obtenir le nombre dans les 15 derniers bits pour faire correspondre les valeurs attendues. Au lieu de 3,14, je reçois 3,4587, etc.

Si quelqu'un pouvait me donner un indice sur ce que je fais de mal, j'apprécierais. Plus que toute autre chose, le fait que je n'ai pas compris cela après des heures de travail avec ça me rend un peu fou. :-)

+0

Vous avez un problème avec le masque wholePart que les données de test ne seront pas re veau. Les parenthèses doublées dans l'expression fractionPart ne correspondent pas aux parenthèses dans l'expression wholePart; mais je ne vois pas de raison de déplacer la fractionPart de toute façon. Le masque fractionPart est également faux. –

Répondre

0
int wholePart = ((value & 0x7FFFFFFF) >> 15); 

int fractionPart = (value & 0x00007FFF); 

clé de votre masque de bits en Calculatrice en mode binaire et puis retournez à Hex ...

1

Jetez un oeil à ce que vous êtes anding la partie de fraction avec avant le changement .

2

Quelques choses ...

Pourquoi ne pas faire la partie décimale comme

int fractionPart = value & 0x00007FFF; // i.e. no shifting needed... 

De même, aucun décalage nécessaire pour le signe

boolean signed = ((value & (0x80000000) != 0); // signed is true when negative 

Voir la réponse de Ryan pour l'utilisation efficace de la partie partie fractionnaire, c'est à dire ne pas prendre cela littéralement comme les valeurs numériques pour la partie décimale, mais plutôt ... certains 'impliquant af raction ...

4

Les entrées de la société ne sont pas fausses.Les bits fractionnaires ne représentent pas les chiffres littéraux à droite de la virgule décimale, ils représentent la partie fraction. Je ne sais pas comment le dire autrement sans le donner. Serait-ce un trop grand indice pour dire qu'il y a un fossé?

+0

Oh. Je suis viré ... –

+0

À 5 décimales, c'est correct (et les valeurs données s'impriment avec précision à 5 décimales comme ci-dessus avec 3 zéros supplémentaires). Une fraction de 15 bits donne environ 0.00003 (1/32K) par compte, donc 4 ou 5 décimales sont raisonnables. –

0

Décalage vers la droite 31 vous donne le bit signé 1 = Nég 0 = Pos

 
BEFORE siiiiiii iiiiiiii ifffffff ffffffff 
SHR 31 00000000 00000000 00000000 0000000s 

Maj gauche 1 suivi par Décalage vers la droite 16 vous donne le nombre entier bits de

 
BEFORE siiiiiii iiiiiiii ifffffff ffffffff 
SHL 1 iiiiiiii iiiiiiii ffffffff fffffff0 
SHR 16 00000000 00000000 iiiiiiii iiiiiiii 

Décalage vers la gauche 17 suivie Shift Right 15 donne pour les bits de faction

 
BEFORE siiiiiii iiiiiiii ifffffff ffffffff 
SHL 17 ffffffff fffffff0 00000000 00000000 
SHR 16 00000000 00000000 0fffffff ffffffff 

Questions connexes