IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Manipulation binaire 64 bits


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    dev de jeu amateur
    Inscrit en
    Avril 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Japon

    Informations professionnelles :
    Activité : dev de jeu amateur

    Informations forums :
    Inscription : Avril 2015
    Messages : 27
    Par défaut Manipulation binaire 64 bits
    Bonjour,

    Pour mon projet (dont je doit rendre un premier contre-rendu le 20 avril :'( ) J'ai un gros problème que je n'arrive pas à résoudre depuis plusieurs semaine. Je dispose d'une grille de 64 cases. Pour modéliser un ensemble de position d'un type objet B donné, je voulais coder des entiers sur 64 bits où si B est présent à la i-ème case, alors le i-ème bit vaudra 1 et sinon 0. Comme ça si je veux savoir si des ensembles on des positions en commun ou aucune, inclusion d'ensemble etc.. j'étais sensé pourvoir utilisé les opérations logique & || (intersection, inclusion) pour pouvoir gagner du temps. Malheureusement, quand je teste avec des petits nombres, pas de problème mais avec de grand nombre ça me renvoie soit un truc qui n'a rien à voir, soit 0.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    console.log((111 & 101)); // renvoie 101 comme attendue
     
    console.log((1001000000 & 1000000000)); // renvoie 998901760
     
    console.log((998901760).toString(2)); // Mais en binaire ça correspond à 111011100010100000100000000000
    Est-ce un problème d'encodage avec les grands nombres ou il y a un moyen de contourner ça ?

  2. #2
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    la valeur 1001000000 vaut 111011101010100000110001000000 en binaire
    la valeur 1000000000 vaut 111011100110101100101000000000 en binaire

    et un AND sur ces 2 valeurs donne bien un 111011100010100000100000000000 binaire soit 998901760 en système décimal.

    donc, ou est le problème ???

    sinon depuis ECMAScript 6 tu peux écrire tes variables en binaire en les précédent d'un 0b (chiffre zéro suivit d'un b)

    exemple
    var monBinaire = 0b101; // = valeur 5 en décimal.

    reste bien sur la limtation à 252 -1 pour tous les valeurs manipulées en précision sur javascript ( norme IEEE_754 )

  3. #3
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut


    JavaScript utilise la norme IEEE-754, soit une précision sur quinze à seize chiffres décimaux.

    Pour les grands nombres, il existe des bibliothèques externes, par exemple : BigNumber et Int64.

    node-int64 : https://stackoverflow.com/questions/...4-bit-integers
    Big Number : http://jsfromhell.com/classes/bignumber

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  4. #4
    Membre averti
    Homme Profil pro
    dev de jeu amateur
    Inscrit en
    Avril 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Japon

    Informations professionnelles :
    Activité : dev de jeu amateur

    Informations forums :
    Inscription : Avril 2015
    Messages : 27
    Par défaut
    Donc imaginons que j'ai un entier N = 1152923153874288600. Je veux afficher le résultat de N AND N.

    Si je fais console.log(1152923153874288600 & 1152923153874288600 ); // affiche 0 au lieu de N
    ça m'affiche 0 car l'entier est trop grand par rapport à la précision ?

    vu qu'en binaire c'est censé être le même chiffre

  5. #5
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    Citation Envoyé par TomHardcore_ Voir le message
    vu qu'en binaire c'est censé être le même chiffre
    dans l'absolu, oui, c'est le même chiffre.

    Mais la, tu utilise le langage Javascript et qui utilise la norme IEEE-754 pour fixer la limite de la grandeur maxi des chiffres qu'il peut traiter.

    Et comme l' écrit danielhagnoul si tu veux utiliser une plus grande précision il faut utiliser BigNumber ou Int64 ou encore une bibliothèque de calcul comme Numeral.js ou decimal.js.

    mais même ces bibliothèques ont leurs limitations et on ne peut pas les utiliser pour faire des calculs astronomiques.

    Le principe de la représentation binaire utilisé par JavaScript est de tenir dans un registre du microprocesseur et celle-ci est actuellement fixée à 64 bits, c'est à dire en utilisant une mantisse des 52 digits binaires, une partie exposant de 11 bits, et le dernier 1 bit est utilisé pour indiquer le signe.
    Le jeu d’instruction en assembleur des processeurs 64bits sont câblés pour faire l'ensemble des opérations arithmétiques, booléennes, trigonométriques, etc.. , sur 64bits.

    Les interpréteurs JavaScript sont écrits pour ce type de processeurs sur 64bits.

    Ton chiffre à 19 digits ne rentre pas dans une écriture binaire sur 52 digits, et il en résulte qu'il ne peut pas être pris en compte pour des les opérations booléennes et renvoie donc zéro.

    test =>
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    alert (Number.isSafeInteger(1152923153874288600)); // renvoie false)

  6. #6
    Membre averti
    Homme Profil pro
    dev de jeu amateur
    Inscrit en
    Avril 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Japon

    Informations professionnelles :
    Activité : dev de jeu amateur

    Informations forums :
    Inscription : Avril 2015
    Messages : 27
    Par défaut
    Hmm Je comprends. Le nombre le plus grand que je suis succeptible d'avoir besoin est 2^64 donc c'est carrément mort. Je pense que je vais tout simplement me tourner vers une autre solution pour gérer mes ensembles... merci quand même

  7. #7
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    Si tu n'a juste que le soucis de faire les 4 ou 5 opérations booléennes sur tes valeurs, alors tu peux facilement t'écrire ta propre librairie dans un objet JavaScript qui manipulerai des strings remplis de zéro et de un.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FreeBSD] Compat binaire 32 bits
    Par Gnux dans le forum BSD
    Réponses: 3
    Dernier message: 19/06/2006, 17h43
  2. Manipulations sur les bits
    Par ThE_LaSt dans le forum C
    Réponses: 23
    Dernier message: 27/03/2006, 14h22
  3. Réponses: 15
    Dernier message: 03/10/2005, 16h49
  4. Manipulations binaires : savoir si un bit est "set"
    Par DiGiTAL_MiDWAY dans le forum Général Python
    Réponses: 2
    Dernier message: 18/09/2005, 16h42
  5. Remplir un fichier binaire de BITS !!!!
    Par ben13 dans le forum C
    Réponses: 98
    Dernier message: 08/01/2005, 19h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo