Stratégie pour décaler des bits

Résolu
Utilisateur anonyme - 7 mai 2008 à 11:48
 Utilisateur anonyme - 10 mai 2008 à 13:35
Salut la compagnie ,

Je travaille sur les fichiers midi : les évènements midi utilisent un paramètre qui est un DeltaTime et qui peut (et doit ) codé sur 32 bi</gras>. Sauf qu'il y a un sauf  (ben oui sinon c'est pas drole).

Z'explique le truc :

Prenons un longword bidon :

10000001   10110001   10110001   1010001

Selon la norme Midi il faut sucré pour chaque Bytes le premier bit (ou le dernier si on va de la gauche vers la droite)

On obtient donc ceci

(1)0000001   (1)0110001   (1)0110001   (1)010001

On rafistole le tout (Encore un truc à la Mac Gyver ) :

On obtient  0000001 0110001  0110001 010001

On remplace les bits "perdus" par des zéros

On obtient : 0000 0000001 0110001  0110001 010001

Même si je connais les opérateurs binaires, je n'ai aucune idée de comment faire la chose.

Merci à vous

26 réponses

cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
8 mai 2008 à 10:02
Compiler le C !


Ah, Cari en voilà une bonne idée !

Ken@vo








Code, Code, Codec !
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
8 mai 2008 à 13:09
"Je suis en Little Endian"


comme la pluspart des machine ^^

sinon j'espere que ma petite explication t'auras aide


parcontre vu que tu fais de la manipulation bit a bit faudras peut etre que tu prevois de gerer

l'endian de la machine ^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
Utilisateur anonyme
8 mai 2008 à 15:27
Arff Thomas c'est pas encore ca.

Tout doucement j'avance :

Function CutSevenBits(V: longword):longword;
type
  TTabByte = array[0..3] of byte;
var
  TByte : TTabbyte absolute v; // TByte et v partagent les mêmes octets
  LW0,LW1,LW2,LW3:LongWord;
  BT0,BT1,BT2, BT3 : Byte;
begin
  BT0:= Tbyte[0] ;
  BT0:=BT0 SHL 1;
  BT0:=BT0 SHR 1;
  LW0:=BT0 * $01000000 ;

  BT1:= Tbyte[1] ;
  BT1:=BT1 SHL 1;
  BT1:=BT1 SHR 1;
  LW1:=BT1 * $00010000 ;

  BT2:= Tbyte[2] ;
  BT2:=BT2 SHL 1;
  BT2:=BT2 SHR 1;
  LW2:=BT2 * $00000100;

  BT3:= Tbyte[3] ;
  BT3:=BT3 SHL 1;
  BT3:=BT3 SHR 1;
  LW3:=BT3 ;
  Result:=LW3;
end;

En prenant 10000001 10110001 10110001 10110001
J'obtient pour respectivement pour LW0 à LW3:
00000000 00000000 00000000 00110001 => Ok
00000000 00000000 00110001 00000000 => Ok
00000000 00110001 00000000 00000000 => Ok
00000001 00000000 00000000 00000000 => Ok
0
Utilisateur anonyme
8 mai 2008 à 15:35
Bon ben voila j'ai la solution

Function CutSevenBits(V: longword):longword;
type
  TTabByte = array[0..3] of byte;
var
  TByte : TTabbyte absolute v; // TByte et v partagent les mêmes octets
  LW0,LW1,LW2,LW3:LongWord;
  BT0,BT1,BT2, BT3 : Byte;
begin
  BT0:= Tbyte[0] ;
  BT0:=BT0 SHL 1;
  BT0:=BT0 SHR 1;
  LW0:=BT0 * $01000000 ;

  BT1:= Tbyte[1] ;
  BT1:=BT1 SHL 1;
  BT1:=BT1 SHR 1;
  LW1:=BT1 * $00010000 ;

  BT2:= Tbyte[2] ;
  BT2:=BT2 SHL 1;
  BT2:=BT2 SHR 1;
  LW2:=BT2 * $00000100;

  BT3:= Tbyte[3] ;
  BT3:=BT3 SHL 1;
  BT3:=BT3 SHR 1;
  LW3:=BT3 ;
  Result:=LW0 OR LW1 OR LW2 OR LW3;
end;

10000001 10110001 10110001 10110001  Se tranforme en
00000001 10110001 10110001 00110001 . Donc c'est bon

Par contre je trouve pas ca propre
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
8 mai 2008 à 15:46
Et merde c'est pas bon: j'ai parlé trop vite
0
Utilisateur anonyme
8 mai 2008 à 16:28
Il y aurais pas moyen de décaller les longword d'un bit comme ceci

00000000 00000000 00110001 00000000
00000000 00000000 00011000 10000000

Car si je fais un SHR 1 ca fait tout sauf ca

Merci
0
Rejoignez-nous