6
votes

Comment puis-je obtenir / définir des bits individuels dans un flotteur?

Je dois admettre dans tout mon travail avec Java, je n'ai jamais rencontré la nécessité d'une Union Java (comme l'Union C, pas du SQL One) et je ne trouve pas de réponse ici. Certes, la plupart de mes travaux en Java ont été à des abstractions plus élevées que le bit-filed.

J'ai un entier que je fixe des bits individuels pour et je souhaite imprimer l'équivalent IEEE754 Float de précision IEEE754.

en C, je ferais quelque chose comme: xxx

Comment puis-je faire une chose la même dans Java? Est-il même possible de traiter la même mémoire que deux types de données différents dans Java?

J'ai effectué la recherche sur les deux alors et ailleurs pour "Java Union", mais cela m'a discuté avec SQL Stuff - Je n'ai pas pu trouver un moyen de faire cela.


0 commentaires

5 Réponses :


9
votes

substituts des constructions C manquantes

Les concepteurs de la programmation Java la langue a choisi d'omettre l'union construire parce qu'il y a beaucoup Meilleur mécanisme pour définir un seul Type de données capable de représenter Objets de différents types: sous-typing. UNE Union discriminée n'est vraiment qu'un imitation pallide d'une hiérarchie de classe.

comprend des exemples.


7 commentaires

Oui, mais une hiérarchie de classe n'est pas bonne ici. Je veux pouvoir le définir comme un type et le lire comme un autre. Une hiérarchie de classe me forcera à la définir et à le lire comme le même type.


Sauvegardons-vous - y a-t-il un moyen de changer un peu dans un flotteur? C'est ce que je cherche. Je veux être capable de définir (par exemple) les bits 31, 27, 4 et 0 du flotteur pour voir quelle valeur qui est.


int bits = float.floattingbits (à flot); / * Utiliser des opérateurs Bitwise dans le vecteur IEEE 754 bits * / AFLOAT = flotteur.IntBittstofloat (bits);


La question de la manipulation de flotteurs ou des syndicats est-elle? Les deux ne semblent avoir rien à voir les uns avec les autres.


@skaffman, Union serait de la manière dont je l'aurais fait avec C. Je ne savais pas que la classe de flotteur a fourni des conversions de bits brutes, la deuxième phrase de la question est probablement celle qui est plus pertinente.


Ouais, je me souviens des syndicats maintenant ... ça fait un moment depuis que j'ai fait c :)


Dire qu'une "union discriminée n'est vraiment qu'une imitation pallid d'une hiérarchie de classe" n'est que des malentendus émenses de ce qu'est une union discriminée.



3
votes

Certains articles et faq utiles à ce sujet sont,

Types Union en Java?

substituts des constructions C manquantes


0 commentaires

12
votes

J'ai un entier que je mets bits individuels pour et je veux Imprimer l'équivalent IEEE754 flotteur de précision unique.

Utilisez IntBitStofloat () < / a> pour cela.


6 commentaires

Claquer. C'est ce que j'étais après. Et je vois que l'inverse est float.floattorawintbits. Maintenant, j'ai juste besoin de la variante double / longue, mais je suppose, s'il y en a un, ce sera dans la double classe. Je vais y trouver. Merci tas.


La connexion avec les syndicats est qu'ils permettent à plusieurs types de données d'exister dans le même emplacement de la mémoire, ce qui permet de convertir efficacement d'un type à un autre. Pax devait faire une chose similaire avec un Int et un flotteur et, provenant d'un contexte C, est naturellement tombé à l'approche de l'Union - mais ne pouvait pas trouver comment faire cela en Java. Heureusement pour lui, son scénario particulier est traité par les bibliothèques standard.


Ouais, ma seule autre pensée était d'écrire le Int vers un fichier et de le lire comme un flotteur. J'étais assez certain qu'il y avait une meilleure façon que que . Merci, les gars, alors prouve encore sa valeur.


Un bel exemple pour la facilité de tomber dans le piège de supposer que pour atteindre X, vous devez faire Y, alors demandez comment faire Y plutôt que sur la manière de réaliser X.


Ah, Gotcha. Oui, c'était une question plutôt rond-point pour atteindre quelque chose de simple :)


Un bel exemple de pourquoi je me sens hors de l'air lorsque vous travaillez à Java. Les syndicats sont brillants!



5
votes

Java ne fournit aucun moyen de traiter une valeur comme une autre valeur sur le niveau de bit brut - sans syndicats, rien de tel que Reterpret_cast . Toutefois, pour votre cas particulier de traitement float comme int et inversement, vous pouvez utiliser java.lang.float.floatTointbits et et IntBitStofloat Méthodes.


1 commentaires

+1 Pour l'info, même si @MB vous battait simplement. Merci.



4
votes

Si vous êtes intéressé à accéder à la représentation au niveau du bit d'un flotteur, java.lang.double contient la méthode pour le faire (DoubleToLongbits, etc.)

Union'ing entre les types de pointeur (ou entre les pointeurs et leur représentant numérique) ouvrirait des trous dans le système de type, il est donc strictement impossible.


1 commentaires

+1. Et cela se termine de ma quête (j'aurai besoin de cela pour le double / long plus tard). Ta.