|
Pages: [1]
|
 |
|
Auteur
|
Sujet: [CAML] Addition binaire (Lu 830 fois)
|
|
ptidom
|
Tout est dans le titre, je ne vois pas du tout comment gerer la retenu dans une addition de nombre binaire, avec cei par exemple let tab1 = [|1;0;0;1;0;1;0;1;0|];; let tab2 = [|0;0;1;0;1;0;1;0;1|];;
A la main ya pas de soucis, bien sur, mais je vois pas comment le programmé, et google a rien pour moi 
|
|
|
|
|
Journalisée
|
- ptidom -
|
|
|
|
tetram9
|
c'est pas plus simple de faire l'addition en décimal et de convertir le résultat ?
|
|
|
|
|
Journalisée
|
|
|
|
Shaoulah
Mangue.org - CA
Full Member
    
Messages: 189
Blurp ...
|
J'avais codé un truc dans le genre en SML quand j'étais à la fac, je regarde si je retrouve et je te dis ....
|
|
|
|
|
Journalisée
|
|
|
|
|
ptidom
|
tetram9> oui, mais non, en caml (sous windows surement) ce nombre : let a = 0x89ABCDEF "depasse " les entiers, donc la prof nous a dit de partir sur des entiers representés par par des tableau Shaoulah> ca serait super  , en plus je connais SML, par mon passage à la fac d'amiens 
|
|
|
|
|
Journalisée
|
- ptidom -
|
|
|
dake
Mangue.org - ZP
Full Member
  
Sexe: 
Messages: 136
|
Je ne connais pas du tout le Caml (normal  alors je pars du principe que ça ressemble aux langages fonctionnels que j'ai déjà rencontré. Si l'on considère les tab1 et tab2 comme des listes alors tu dois pouvoir récupérer le dernier élément de la liste et recréer deux listes sans leur dernier élément. Tu prends tes deux éléments terminaux, tu fais ton addition binaire selon la retenue, tu gardes la retenue obtenue dans un coin (tu peux la mettre dans une liste pour simuler une pile) et ainsi de suite jusqu'à ce que tes listes soient vides.
|
|
|
|
|
Journalisée
|
|
|
|
|
ptidom
|
ah ouais peut etre....
|
|
|
|
|
Journalisée
|
- ptidom -
|
|
|
Shaoulah
Mangue.org - CA
Full Member
    
Messages: 189
Blurp ...
|
ptidom: désolé mais impossible de mettre la main sur mon programme ...
|
|
|
|
|
Journalisée
|
|
|
|
|
ptidom
|
voila ce que j'ai reussi a faire, mais j'ai une erreur que je comprend pas vraiment, et surtout me taper pas j'ai jamais appris le caml  let addbinaire b1 b2= let retenue = 0 and i = ref 0 and taille = (Array.length b1) in let addret bit1 bit2 ret =
if bit1 = 0 && bit2 = 0 && ret = 0 then [0;0] else if (bit1 = 0 && bit2 = 0 && ret = 1) || (bit1 = 0 & bit2 = 1 & ret = 0) || (bit1 = 1 & bit2 = 0 & ret = 0) then [0;1] else if (bit1 = 0 && bit2 = 1 && ret = 1) || (bit1 = 1 & bit2 =0 & ret = 1) || (bit1 = 1 & bit2 = 1 & ret = 0) then [1;0] else if (bit1 = 1 && bit2 = 1 && ret = 1) then [1;1] in while !i<taille do l = addret b1.(!i) b2.(!i) retenue; (*retenue := l.(0); sortie.(!i) <- l.(1);*) done; sortie; ;;
et l'erreur est This expression has type 'a list but is here used with type unit sur le [1;1] et je vois pas
|
|
|
|
|
Journalisée
|
- ptidom -
|
|
|
|
ptidom
|
bon et bien maintenant je suis bloqué la, si quelqu'un pouvait m'aider :
let addbinaire b1 b2= let retenue = 0 and i = ref 0 and taille = (Array.length b1) and l = [||] and sortie = Array.make (Array.length b1) and addret bit1 bit2 ret =
if (bit1 = 0 && bit2 = 0 && ret = 0) then [|0;0|] else if (bit1 = 0 && bit2 = 0 && ret = 1) || (bit1 = 0 & bit2 = 1 & ret = 0) || (bit1 = 1 & bit2 = 0 & ret = 0) then [|0;1|] else if (bit1 = 0 && bit2 = 1 && ret = 1) || (bit1 = 1 & bit2 =0 & ret = 1) || (bit1 = 1 & bit2 = 1 & ret = 0) then [|1;0|] else [|1;1|] in while !i<taille do l = addret b1.(!i) b2.(!i) retenue; retenue = l.(0); sortie.(!i) = l.(1); i :=!i+1; done; sortie; ;;
|
|
|
|
|
Journalisée
|
- ptidom -
|
|
|
|
ptidom
|
ben ya personne qui connait un peu caml, et qui veut l'installer vite fait pour me depanner 
|
|
|
|
|
Journalisée
|
- ptidom -
|
|
|
|
ptidom
|
let addbinaire b1 b2= let retenue = ref 0 and taille = (Array.length b1) and i =ref ((Array.length b1)-1) and sortie = Array.make (Array.length b1) 0 and addret bit1 bit2 ret =
match (bit1,bit2,ret) with (0,0,0) -> [|0;0|] |(0,0,1) -> [|0;1|] |(0,1,0) -> [|0;1|] |(1,0,0) -> [|0;1|] |(0,1,1) -> [|1;0|] |(1,0,1) -> [|1;0|] |(1,1,0) -> [|1;0|] |(1,1,1) -> [|1;1|] | _ -> [||]
in while !i >= 0 do let l = addret b1.(!i) b2.(!i) !retenue in retenue := l.(0); sortie.(!i) <- l.(1); decr i; done; sortie; ;;
addition binaire modulo 32 bits
|
|
|
|
|
Journalisée
|
- ptidom -
|
|
|
|
|
Pages: [1]
|
|
|
 |