Bonjour,
Quelle serait pour vous la meilleure solution pour coder dans un WORD une valeur non-signée sur 12 bits complétée par une autre sur 4 bits ?
Le tout pouvant être utilisé dans des tableaux !
Quelle serait votre approche ?
Bonjour,
Quelle serait pour vous la meilleure solution pour coder dans un WORD une valeur non-signée sur 12 bits complétée par une autre sur 4 bits ?
Le tout pouvant être utilisé dans des tableaux !
Quelle serait votre approche ?
Bonjour !
Je ne sais pas si c'est la meilleure solution, mais personnellement j'aurais fait quelque chose comme ça :
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
39
40
41
42
43
44 {$ASSERTIONS ON} type T1 = 0..4095; T2 = 0..15; function Encode(const v1: T1; const v2: T2): word; begin result := (v1 shl 4) or v2; end; procedure Decode(const w: word; out v1: T1; out v2: T2); begin v1 := w shr 4; v2 := w and 15; end; var w: word; v1: T1; v2: T2; begin Assert(%1111111111111111 = 65535); Assert(%111111111111 = 4095); Assert(%1111 = 15); w := Encode(4095, 15); Assert(w = 65535); Decode(w, v1, v2); Assert(v1 = 4095); Assert(v2 = 15); Randomize; v1 := Random(4096); v2 := Random(16); WriteLn(v1); WriteLn(v2); w := Encode(v1, v2); Decode(w, v1, v2); WriteLn(v1); WriteLn(v2); end.
Bonjour,
Il existe aussi des enregistrements qui proposent la compression binaire comme cela si je ne fais pas erreur :
Mais je suis loin d'être sûr que c'est pertinent en efficacité comme en lisibilité (le moindre usage demandera des transtypages un peu partout que la solution de Roland masque).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 TStrange = bitpacked record T1 = 0..4095; T2 = 0..15; end;
Salutations.
Pourquoi, il faudrais des transtypages partout, cette affirmation me laisse un peu dubitatif...
je vais faire des essais pour comprendre ta remarque.
Bonjour,
Normalement Pascal est un langage typé et devrait interdire un truc du genre :
et demander :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 var i : Cardinal: // ou Word... Strange : TStrange; //... i := Strange.T1;
A vérifier le degré de tolérance du compilateur FreePascal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part i := Cardinal(Strange.T1);
Il y a aussi la possibilité de déclarer des types TCard12 = 0..4095; et TNibble = 0..15; mais cela ne recule le problème que d'un cran car le reste du programme utilisera certainement d'autre types plus communs.
Sur ce plan, C et C++ paraissent plus souples avec leurs champs binaires typés.
Salutations
Il est possible d'affecter un Byte à un Int64 sans trranstypage, pourquoi pas un sous-ensemble à un Word ? A tester en tout cas.
Autre voie possible, celle des helpers, peut-être plus "naturelle" ?
Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
. Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !
Partager