Bonjour,
J'ai besoin d'une variable sur 64 bits non signé. Je voudrais savoir si c'est possible.
Les variables de type long sont signé. Est ce qu'il existe, comme ne C, d'avoir un unsigned long?
Merci
Bonjour,
J'ai besoin d'une variable sur 64 bits non signé. Je voudrais savoir si c'est possible.
Les variables de type long sont signé. Est ce qu'il existe, comme ne C, d'avoir un unsigned long?
Merci
Une petite recherche google :
http://darksleep.com/player/JavaAndUnsignedTypes.html
Une possibilité est de le stocker sous forme d'un byte[] de 8 bytes.
(Puis quand on y réfléchit, c'est la même chose qu'un short[] de 4 shorts, ou un int[] de 2 ints. Puis quand on y réfléchit, on peut utiliser directement un long, à condition de le parser et le formater soi-même pour faire comme s'il était non signé, et de ne pas utiliser les opérateurs de comparaison.)
Autre possibilité : BigInteger, qui peut représenter autant de bits qu'on veut. Problème : il faut gérer soi-même le fait qu'il ne doit pas dépasser 64 bits positifs, et qu'il ne doit pas être négatif.
la seule différence entre un 64 bits signé et un 64 bits non signé c'est le comportement de la comparaison et des opération division, multiplication. Ainsi que le casting (32 bits signé -> 64 bits signé ne donne pas le même résultat que 32 bits non signé -> 64 bits non signée pour la même série de bits).
Pour le reste c'est identique, donc la question est surtout, quel est le besoin sous-jacent?
Salut,
J'ai eu le même problème que tupac25: devoir utiliser un nombre qui dépasse la valeur max d'un Long...
Effectivement, difficile d'utiliser le type de taille supérieure au Long... J'ai donc utilisé le BigInteger, mais maintenant, j'ai un gros problème de perfo...
J'utilise entre autres la méthode shiftRight() à la place de l'opérateur >>.
Appelée des milliers de fois, la vitesse de génération de mes données (écriture dans un fichier, mais ça donne une idée) passe de quelques Mo toutes les 2/3 secondes, à une dizaine de Ko toutes les 10/20 secondes.
Cette baisse de perfo est-elle normale ? Y a-t-il un moyen de contourner/améliorer ça ?
Merci !
Hélas oui. Tu n'utilises plus des types de base et des opérateurs, tu utilises des instances d'objet et des appels de méthodes.
Utiliser les long normaux et faire comme s'ils n'étaient pas signés. L'addition et la soustraction fonctionnent pareil, le left-shift aussi.
Le right-shift c'est un peu plus compliqué, si le bit de poids fort était à 1 (nombre négatif,) il met à nouveau 1 à ce bit après décalage. Il faut donc le forcer à zéro.
Partager