Précédent   Forum des professionnels en informatique > Java > Général Java
Général Java Java SE, Java ME, APIs, Persistance, JDBC, Spring, XML. Avant de poster -> FAQ Java, Sources Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/02/2012, 16h25   #1
Membre chevronné
 
Avatar de atha2
 
Homme Gabriel VIOT
Étudiant
Inscription : janvier 2007
Messages : 457
Détails du profil
Informations personnelles :
Nom : Homme Gabriel VIOT
Âge : 24
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2007
Messages : 457
Points : 664
Points : 664
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 :
1
2
3
byte b1 = ....;
byte b2 = (byte) ((((b1 & (byte) 0xF0) & (short) 0x00FF) >> (byte) 4) & (byte) 0x0F);
ne peut-on pas écrire simplement:
Code :
1
2
byteb2 = ((b1 & (byte) 0xF0) >> (byte) 4) & (byte) 0x0F;
??

voir même
Code :
1
2
byteb2 = (b1 >> (byte) 4) & (byte) 0x0F;
Ou alors il y a vraiment une embrouille avec le bit de signe dans certain cas ?
atha2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 17h11   #2
Modérateur
 
Avatar de dinobogan
 
Homme Dinobogan Shelashyn
ingénieur étude et développement
Inscription : juin 2007
Messages : 3 276
Détails du profil
Informations personnelles :
Nom : Homme Dinobogan Shelashyn
Âge : 31
Localisation : France

Informations professionnelles :
Activité : ingénieur étude et développement
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2007
Messages : 3 276
Points : 4 886
Points : 4 886
Les cast pour les opérateurs & et >> sont inutiles car les opérateurs seront toujours castés en int.

Le code suivant :
Code :
byte b2 = (byte) ((((b1 & (byte) 0xF0) & (short) 0x00FF) >> (byte) 4) & (byte) 0x0F)
devrait être simplifiable en :
Code :
byte b2 = (byte) ((b1 & 0xF0 ) >> 4 )
équivalent à :
Code :
byte b2 = (byte)( (b1 >> 4) & 0xF )
__________________
Que la force de la puissance soit avec le courage de ta sagesse.
dinobogan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 17h33   #3
Membre chevronné
 
Avatar de atha2
 
Homme Gabriel VIOT
Étudiant
Inscription : janvier 2007
Messages : 457
Détails du profil
Informations personnelles :
Nom : Homme Gabriel VIOT
Âge : 24
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2007
Messages : 457
Points : 664
Points : 664
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 :
byte b2 = (byte) ((b1 & 0xF0 ) >> 4 )
C'est pas plutôt :
Code :
byte b2 = (byte) ((b1 & 0xF0 ) >>> 4 )
? Pour éviter la propagation du bit de signe ?
atha2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 19h09   #4
Expert Confirmé Sénior
 
Inscription : septembre 2004
Messages : 5 093
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 093
Points : 7 019
Points : 7 019
Citation:
Envoyé par atha2 Voir le message
C'est pas plutôt :
Code :
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.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 10h52   #5
Membre chevronné
 
Avatar de atha2
 
Homme Gabriel VIOT
Étudiant
Inscription : janvier 2007
Messages : 457
Détails du profil
Informations personnelles :
Nom : Homme Gabriel VIOT
Âge : 24
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2007
Messages : 457
Points : 664
Points : 664
Oui c'est vrai.
Merci.
atha2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h32.


 
 
 
 
Partenaires

Hébergement Web