bonjours,
je veux definir une structure dont l'un des elements est sur 3 bits et l'autre est sur 5 bits.
puis diviser un octet entre les deux elements.
merci
bonjours,
je veux definir une structure dont l'un des elements est sur 3 bits et l'autre est sur 5 bits.
puis diviser un octet entre les deux elements.
merci
Les structures n'existent PAS en java.
Pour extraire des morceaux de byte tu dois te débrouiller avec les opérateurs de décalage binaire (>> <<) et les opérateurs logiques (& | ^).
ce que je cherche c'est peut etre comme le c++
ça n'existe pas en java ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 unsigned char element1 : 4; unsigned char element2 : 4;
Non l'équivalent exact n'existe pas en java. Ce que tu peux faire c'est:
ou inversement:
Code : Sélectionner tout - Visualiser dans une fenêtre à part byte champs = (element1 << 4) | (element2 & 0xF)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 byte element1 = champs >> 4; byte element2 = champs & 0xF
bon je veux poser encore une autre question:
de point de vue memoire, si j'ai beaucoups de champs, le c++ me procure une gestion de structure memoire plus adéquoite, dans ce cas que le java???
si t'as beaucoup de champs à gérer avec 3 bits pour l'un, 5bits pour l'autre, etc. Tu stocke çà sur une série de int bruts et tu crée des méthodes pour accéders au bits dont tu as besoin. Exemple simple avec 2*4bits:
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 public class MonType{ private byte data; private static final byte CHAMP1 = 0x0F; private static final byte CHAMP2 = 0xF0; public void setChamp1(byte champ1){ setChamp(champ1,CHAMP1); } public byte getChamp1(){ return getChamp(CHAMP1); } public void setChamp2(byte champ2){ setChamp(champ2,CHAMP2); } public byte getChamp2(){ return getChamp(CHAMP2); } public byte getChamp(byte champ){ return data & champ } public byte setChamp(byte champ, byte masque){ data = data & ! masque | data & masque; } }
Je ne suis pas sur de comprendre ta solution tchize.
S'il faut stoquer deux nombre dans un même byte, je pense qu'il faudra utiliser les opérateurs de décalage.
De plus je pense qu'il y a au moins une erreur la:
car il mes semble bien que ça revienne à faire data=data;
Code : Sélectionner tout - Visualiser dans une fenêtre à part data = data & ! masque | data & masque;
ouais, j'ai codé à la vatrovite manque l'oprateur de décalage et le deuxième data toi être champ bref c'est n'importe nawak, mais bon, l'idée reste là: si il veux vraiment compacter, il fait un classe avec des getters/setter qui gère elle même les bits en arrière plan
Voici mon essai de classe pour gérer un byte en deux parties. J'ai pas testé non plus mais ça me parait correct.
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
28
29
30
31
32
33
34
35
36
37
38 class SplittedByte{ private byte fullValue; private int lowPartSize; private byte lowPartMask; public SplittedByte(int highPartSize, int lowPartSize){ if (highPartSize+lowPartSize != 8) throw new IllegalArgumentException("La somme de la taille des champs ne fait pas 8 bits"); this.lowPartSize=lowPartSize; this.lowPartMask=(byte) ~(0xFF<<lowPartSize); } byte getFullValue(){ return fullValue; } void setFullValue(byte fullValue){ this.fullValue = fullValue; } byte getLowPart(){ return (byte) (fullValue & lowPartMask); } void setLowPart(byte value){ fullValue &= ~lowPartMask; fullValue |= lowPartMask & value; } byte getHighPart(){ return (byte) (fullValue >>> lowPartSize); } void setHighPart(byte value){ fullValue &= lowPartMask; fullValue |= value << lowPartSize; } }
merci à vous tous!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager