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 :

Fonctionnement bit de signe, décalage


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut Fonctionnement bit de signe, décalage
    Bonjour,

    J'aurai besoin d'aide pour la compréhension d'un code manipulant des bits. Le but du code est de récupérer le quartet de poids fort d'un byte (pour décoder du BCD). Ce code est générer automatiquement par un IDE mais j'ai un doute sur sa complexité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    byte b1 = ....;
    byte b2 = (byte) ((((b1 & (byte) 0xF0) & (short) 0x00FF) >> (byte) 4) & (byte) 0x0F);
    ne peut-on pas écrire simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byteb2 = ((b1 & (byte) 0xF0) >> (byte) 4) & (byte) 0x0F;
    ??

    voir même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byteb2 = (b1 >> (byte) 4) & (byte) 0x0F;
    Ou alors il y a vraiment une embrouille avec le bit de signe dans certain cas ?

  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 : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Les cast pour les opérateurs & et >> sont inutiles car les opérateurs seront toujours castés en int.

    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte b2 = (byte) ((((b1 & (byte) 0xF0) & (short) 0x00FF) >> (byte) 4) & (byte) 0x0F)
    devrait être simplifiable en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte b2 = (byte) ((b1 & 0xF0 ) >> 4 )
    équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte b2 = (byte)( (b1 >> 4) & 0xF )
    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 éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    Merci pour ta réponse dinobogan
    Citation Envoyé par dinobogan Voir le message
    Les cast pour les opérateurs & et >> sont inutiles car les opérateurs seront toujours castés en int.
    Je travail en JavaCard et selon les cartes, le type int n'est pas toujours disponible, d'où le cast de 4 en byte (ou short peu importe). Je ne l'avais pas précisé mais d'après https://forums.oracle.com/forums/thr...readID=1749150, l'opération est faite sur 32bits de la même façon qu'en Java standard.
    Citation Envoyé par dinobogan Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte b2 = (byte) ((b1 & 0xF0 ) >> 4 )
    C'est pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte b2 = (byte) ((b1 & 0xF0 ) >>> 4 )
    ? Pour éviter la propagation du bit de signe ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par atha2 Voir le message
    C'est pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte b2 = (byte) ((b1 & 0xF0 ) >>> 4 )
    ? Pour éviter la propagation du bit de signe ?
    En principe il n'y a pas de signe à propager, puisque l'opération & se fait sur 32 bits et que le 0xF0 s'assure que seuls les bits de 4 à 7 puissent être à autre chose que zéro. Le bit de signe, 31, est donc forcément à zéro et le résultat forcément positif.

    En principe. Mais j'avoue ne pas savoir comment une techno Java s'adapte à la non-existence du type int.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    Oui c'est vrai.
    Merci.

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

Discussions similaires

  1. Complément à 2 qui ne change pas le bit de signe
    Par Bolboaa dans le forum Mathématiques
    Réponses: 3
    Dernier message: 15/05/2015, 10h24
  2. [WD15] Décalage de bit vers la droite ">>>" (signe décalé)
    Par TANITE dans le forum WinDev
    Réponses: 10
    Dernier message: 25/01/2013, 10h28
  3. Existe-t'il un type Integer > 64 bits non signé
    Par colorid dans le forum Langage
    Réponses: 2
    Dernier message: 17/08/2012, 07h05
  4. Récupération du bit de signe
    Par Clercq dans le forum Débuter
    Réponses: 10
    Dernier message: 28/11/2009, 11h02
  5. [TP] Entier 32 bits non signé
    Par SkaMan dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 24/08/2005, 22h17

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