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

Java Discussion :

Comprendre code java construction d'un nombre par fragment de bits d'un Long


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 67
    Points
    67
    Par défaut Comprendre code java construction d'un nombre par fragment de bits d'un Long
    Bonjour tout le monde,

    Voici un code qui prend un nombre long et et le fragmente par couple de 7 bits
    et place ces 7 bits dans des payloads avec le bit (continue) tout à gauche dans un octet qui commence par 1
    sauf le dernier qui commence par 0. Mais je ne comprends pas bien le code.

    • (max << 7) |0x7fL >> décale de 7 bits vers la gauche mais le reste ???

      >>> décale de x bits à droite en insérant des 0 à gauche
      mais je ne comprends pas bien ce que fait value >>> (i*7) ??

      (int)((temp | 0x80) & 0xff) je ne comprends pas non plus 0x80 et 0xff quel est l'effet ??...

      Pouvez vous m'aider à comprendre le code merci.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     static private final int SHORT_INTEGER_MAX = 127;
     
    protected void appendUintvarInteger(long value, DataOutputStream f) {
            /*
             * To encode a large unsigned integer, split it into 7-bit fragments
             * and place them in the payloads of multiple octets. The most significant
             * bits are placed in the first octets with the least significant bits
             * ending up in the last octet. All octets MUST set the Continue bit to 1
             * except the last octet, which MUST set the Continue bit to 0.
             */
            int i;
            long max = SHORT_INTEGER_MAX;
            for (i = 0; i < 5; i++) {
                if (value < max) {
                    break;
                }
                max = (max << 7) | 0x7fl;
            }
            while(i > 0) {
                long temp = value >>> (i * 7);
                temp = temp & 0x7f;
                append((int)((temp | 0x80) & 0xff), f);
                i--;
            }
            append((int)(value & 0x7f), f);
        }

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par cilies38 Voir le message
    mais je ne comprends pas bien ce que fait value >>> (i*7) ??
    Il y aura un décalage d'un nombre multiple de 7 à chaque tour de boucle.
    Si i=1, alors il y aura un décalage de 7 bits vers la droite.
    Si i=2, alors il y aura un décalage de 14 bits vers la droite.
    Si i=3, ...

    (int)((temp | 0x80) & 0xff) je ne comprends pas non plus 0x80 et 0xff quel est l'effet ??...
    Les parenthèses sont prioritaires. Donc :
    1. temp | 0x80 : OU binaire. 0x80 vaut 80 en hexadécimal, donc 1000 0000 en binaire. Cela permet "d'allumer" le 8eme bit en partant de la droite (le moins significatif).
    2. valeur & 0xff : ET binaire. 0xff vaut 1111 1111 en binaire. Tous les autres bits de "valeur" seront mis à zéro. Seul les 8 premiers bits (en partant de la droite, les moins significatifs) conserveront leur valeur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 67
    Points
    67
    Par défaut
    Ok et 0x7f permet de mettre 0 au premier bit en partant de la gauche du premier octet. Merci c'est déjà plus clair.

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

Discussions similaires

  1. Réponses: 20
    Dernier message: 09/04/2020, 17h02
  2. comment cacher un dossier par un code java
    Par anikashow dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 26/05/2009, 00h25
  3. Connection à oracle par un code java
    Par ledawa dans le forum JDBC
    Réponses: 6
    Dernier message: 22/07/2008, 09h07
  4. Réponses: 3
    Dernier message: 24/04/2008, 09h13
  5. Générer des diagrammes UML par le code Java
    Par ancrou dans le forum NetBeans
    Réponses: 3
    Dernier message: 03/12/2007, 10h17

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