Page 1 sur 1

Exercice

Publié : 05 juil. 2018, 07:48
par itasoft
slts,
un petit exercice pour se détendre
(ou se prendre la tête, LOL)

cliquer dessus pour agrandir
_LOG.JPG

Re: Exercice

Publié : 13 juil. 2018, 15:08
par Flav
Quelle est cette fonction LOG? Jamais vue.

Edit: Et si y'a plusieurs bits à un? :p

Re: Exercice

Publié : 13 juil. 2018, 15:27
par Kallysto
Flav a écrit : 13 juil. 2018, 15:08 Edit: Et si y'a plusieurs bits à un? :p
Me suis posée la même question mais j'ai voulu être sympa...

Re: Exercice

Publié : 13 juil. 2018, 15:40
par itasoft
slts,
c'est valable que si ya un seul bit à 1

Re: Exercice

Publié : 02 août 2018, 06:43
par steph68
hello,

Code : Tout sélectionner

IF %MW0 <> 0 THEN

	%MW1 := 0;
	%MW0 := %MW0 AND NOT %MW0 + 1; (* isolation du premier bit à 1, ce qui est identique à %MW0 AND -%MW0 *)
	IF (%MW0 AND 16#AAAA) <> 0 THEN %MW1 := %MW1 + 1; END_IF 
	IF (%MW0 AND 16#CCCC) <> 0 THEN %MW1 := %MW1 + 2; END_IF 
	IF (%MW0 AND 16#F0F0) <> 0 THEN %MW1 := %MW1 + 4; END_IF 
	IF (%MW0 AND 16#FF00) <> 0 THEN %MW1 := %MW1 + 8; END_IF 

ELSE

	%MW1 := -1;

END_IF
astuce utilisée:

x AND -x isole le bit à 1 le plus faible
pour éviter des problèmes de conversion si %MW0 est déclaré en type WORD : NOT x + 1 est équivalent à -x

@+

Re: Exercice

Publié : 02 août 2018, 08:31
par ProfnovA
Allez, c'est bien parce que c'est les vacances...

Code : Tout sélectionner

%MW1:= REAL_TO_INT (1.4427 *LN( INT_TO_REAL (%MW0) ) );

Re: Exercice

Publié : 02 août 2018, 10:28
par itasoft
ProfnovA a écrit : 02 août 2018, 08:31 Allez, c'est bien parce que c'est les vacances...

Code : Tout sélectionner

%MW1:= REAL_TO_INT (1.4427 *LN( INT_TO_REAL (%MW0) ) );
bien, pas trouvé de quoi dérive la constante 1.4427 , c'est pas la racine de 2 ?

Re: Exercice

Publié : 02 août 2018, 13:45
par ProfnovA
itasoft a écrit : 02 août 2018, 10:28
ProfnovA a écrit : 02 août 2018, 08:31 Allez, c'est bien parce que c'est les vacances...

Code : Tout sélectionner

%MW1:= REAL_TO_INT (1.4427 *LN( INT_TO_REAL (%MW0) ) );
bien, pas trouvé de quoi dérive la constante 1.4427 , c'est pas la racine de 2 ?
Honnêtement, j'ai fait une courbe de tendance excel, c'est pas beau de tricher...

En fait ça correspond à l'expression de départ transformée en ln (base 2).
La constante est 1 / ( ln(10) * log(2) ).
Ca fait réviser un peu ses classiques.

Re: Exercice

Publié : 02 août 2018, 13:52
par itasoft
slts,
exact, c'est la réciproque de la fonction , va falloir que je révise mes bouquins, lol

Re: Exercice

Publié : 02 août 2018, 19:44
par itasoft
@steph68
ta solution fonctionne, mais si il faut écrire des lignes de programme , on peut faire plus court.

%MW1:=-1;
while %MW0 <>0 do
inc(%MW1);
%MW0:=SHR(%MW0,1);
end_while;

pendant qu'on y est, dans le même principe

(* nombre de bits à 1 dans %MW0 *)
%MW1:=0;
while %MW0 <>0 do
%MW1:=%MW1+(%MW0 AND 1);
%MW0:=SHR(%MW0,1);
end_while;

(* nombre de bits à 0 dans %MW0*)
%MW1:=0;
while %MW0 <>0 do
%MW1:=%MW1+(%MW0 And 1 XOR 1);
%MW0:=SHR(%MW0,1);
end_while;