Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Modérateur : Politburo
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3405
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Voilà un p'tit MPO qui va ravir tous les surdoués du numérique et de l'électronique ...
C'est une question toute bête, mais parfois les idées les plus simples ne sont pas les plus faciles à réaliser !
D'ailleurs, je n'ai pas la moindre idée de comment faire ce calcul. Peut-être y a-t-il sur l'une de vos machines une instruction pour le faire facilement en quelques touches ? Je ne sais pas ?
Voilà, par exemple le nombre 5 s'écrit 0101 en binaire, il contient donc deux bits mis à la valeur une.
Par contre, 1968 s'écrit 0111 1011 0000 en binaire, il en contient donc six, soit trois fois plus que 5, mais autant que 1370.
Et 1279 contient neuf bits à un, c'est à dire trois de plus que 1968 ou 1370 qui sont pourtant plus grands que lui, mais autant que son carré qui fait 1635841.
J'y perds mon arithmétique !
Mais, il doit bien y avoir un moyen de calculer, pour un entier positif donné, le nombre de bits à un que contient sa représentation binaire.
Je compte sur vous et sur vos codes bien organisés pour trouver un moyen efficace, simple et court.
Quelques pas de code ou quelques touches préfixées pour me dire Combien de bits à un il y a dans cet entier !
C'est une question toute bête, mais parfois les idées les plus simples ne sont pas les plus faciles à réaliser !
D'ailleurs, je n'ai pas la moindre idée de comment faire ce calcul. Peut-être y a-t-il sur l'une de vos machines une instruction pour le faire facilement en quelques touches ? Je ne sais pas ?
Voilà, par exemple le nombre 5 s'écrit 0101 en binaire, il contient donc deux bits mis à la valeur une.
Par contre, 1968 s'écrit 0111 1011 0000 en binaire, il en contient donc six, soit trois fois plus que 5, mais autant que 1370.
Et 1279 contient neuf bits à un, c'est à dire trois de plus que 1968 ou 1370 qui sont pourtant plus grands que lui, mais autant que son carré qui fait 1635841.
J'y perds mon arithmétique !
Mais, il doit bien y avoir un moyen de calculer, pour un entier positif donné, le nombre de bits à un que contient sa représentation binaire.
Je compte sur vous et sur vos codes bien organisés pour trouver un moyen efficace, simple et court.
Quelques pas de code ou quelques touches préfixées pour me dire Combien de bits à un il y a dans cet entier !
Modifié en dernier par C.Ret le 26 sept. 2020 21:12, modifié 1 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
- bernouilli92
- Fonctionne à 14400 bauds
- Messages : 5230
- Enregistré le : 21 nov. 2012 13:03
- Localisation : Ile de France
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Ma proposition en RPL :
Code : Tout sélectionner
« 0 → N
«
WHILE DUP
REPEAT
2 / DUP IP SWAP FP 2 *
'N' STO+
END
DROP N
»
»
HP, Casio, Sharp, Psion, quelques TI et divers autres
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Version RPL HP50g, mais c'est un peu de la gruge ;D
31,5 octets
en NewRPL c'est un peu différent :
40 octets
Une version 603P sera plus amusante ;D
Code : Tout sélectionner
« BIN R->B ->STR "1" DUP SREPL »
en NewRPL c'est un peu différent :
Code : Tout sélectionner
« #0b SWAP + ->STR "1" DUP SREPL »
Une version 603P sera plus amusante ;D
Modifié en dernier par Gilles59 le 26 sept. 2020 22:17, modifié 1 fois.
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
- bernouilli92
- Fonctionne à 14400 bauds
- Messages : 5230
- Enregistré le : 21 nov. 2012 13:03
- Localisation : Ile de France
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Il manque un SWAP DROP à la fin. Ou je crois qu’il une autre commande qui fait la même chose sur hp50.
HP, Casio, Sharp, Psion, quelques TI et divers autres
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Oui, c'est NIP ;D Mais j'aimais bien laisser l'affichage en binaire en plus du calculbernouilli92 a écrit : ↑26 sept. 2020 22:15 Il manque un SWAP DROP à la fin. Ou je crois qu’il une autre commande qui fait la même chose sur hp50.
Modifié en dernier par Gilles59 le 26 sept. 2020 22:19, modifié 1 fois.
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Le bon vieux test que l'on fait passer au petit jeune avant de les embaucher pour savoir s'ils savent aligner 3 lignes de code.
Bon c'est pas le plus optimiser et ça fait un bon moment que j'ai pas codé en RPL, j'ai voulu n'utiliser que la stack et de la logique binaire :
Bon c'est pas le plus optimiser et ça fait un bon moment que j'ai pas codé en RPL, j'ai voulu n'utiliser que la stack et de la logique binaire :
Code : Tout sélectionner
« # 0d SWAP R->B
WHILE
DUP # 0d ≠
REPEAT
DUP # 1d AND
ROT + SWAP
SR
END
DROP B->R »
Modifié en dernier par Gege34 le 26 sept. 2020 22:24, modifié 1 fois.
Commodore (64/128/Amiga), HP (28/41/48/50/71/75/200/Prime) et autres (Ti, Canon X07, Psion, Casio, Palm, Thomson, Exl, Amstrad)
- pcscote
- Fonctionne à 300 bauds
- Messages : 160
- Enregistré le : 11 juil. 2018 01:06
- Localisation : Québec/Canada
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Solution RPN pour HP-41: (30 octets, aucune variable)
Code : Tout sélectionner
LBL "BC"
0
X<>Y
ABS
LBL 00
INT
X=0?
GTO 01
ENTER
ENTER
2
MOD
ST+ Z
RDN
LASTX
/
GTO 00
LBL 01
RDN
END
Sylvain
Calculatrices et Pockets HP > J'ai tous les modèles, manuels, accessoires et périphériques, mes préférés: 41, 71 & 75.
Techno : 41 > 41CL, MLDL2K, Clonix-d, NoV-64d, MAXX | 71 > FRAM71, MultiMod | IL > PIL-Box, PIL-IO, GPIO | ...
Calculatrices et Pockets HP > J'ai tous les modèles, manuels, accessoires et périphériques, mes préférés: 41, 71 & 75.
Techno : 41 > 41CL, MLDL2K, Clonix-d, NoV-64d, MAXX | 71 > FRAM71, MultiMod | IL > PIL-Box, PIL-IO, GPIO | ...
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Une version pour Casio FX-602P en 16 pas en comptant l'entête (15 sinon)
Ca doit s'adapter facilement en RPN ;D
EDIT : je cafouille complétement en RPN avec ma 41L... Faudra que je lise la doc de HP41 lol ! L'idée c'est : Je ne sais même pas comment on entre x<>0? En plus ca ne doit probablement pas marcher et c'est plus long que mon prog 602P ;D
Code : Tout sélectionner
[P0]
MAC
LBL0
= / 2 - x=0 GOTO9
FRAC x=0 GOTO0 ISZ GOTO0
LBL9
MR00
EDIT : je cafouille complétement en RPN avec ma 41L... Faudra que je lise la doc de HP41 lol ! L'idée c'est :
Code : Tout sélectionner
0
STO 00
RDN
*LBL 00
2
/
X=0?
GTO 99
ENTER
FRC
X<>0?
1
ST+ 00
RDN
-
GTO 00
*LBL 99
RCL 00
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3405
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
1- En RPL
J'aime bien quelques astuces que tu utilises;
Par ailleurs, FP 2 * c'est un 2 MOD en un plus long.
Et je découvre que STO+ ne fonctionne pas sur HP-28S avec les variables locales
Sur mon HP-28S (après avoir écrit un code pour palier à l'absence de la commande SREPL), en essayant 1968 j'obtiens "# 11110110000b" mais pas le nombre des bits à un
Il doit y avoir une astuce non documentée qui fait que SREPL compte les occurrences des "1" ? Je n'en ai pas trouvé trace dans la documentation fournie par HP :
Génial !
Sans la dernière instruction B→R , on aurait le résultat exprimé en binaire, décimal, octal ou hexadécimal selon le mode en cours. Je me rend compte qu'il n'est donc pas nécessaire de spécifier un mode (DEC BIN HEX OCT ) pour que ton code fonctionne
Effectivement #1b AND est une alternative à FP 2 * quelque soit le mode sélectionné. Par contre, n 1 AND ne fonctionne pas en mode normal car n'effectue pas d'arithmétique binaire et renvoi toujours 1 sauf si l'argument n est nul.
Vos codes m'ont obligés à revoir mon propre code RPL en profondeur qui comme celui de Gilles59 ne contient pas d'instruction WHILLE ... REPEAT ... END, mais qui comme ceux de Gege34 et bernouilli92 effectue une boucle WHILE/REPEAT.
Je vais attendre encore un peu avant de poster, je sens que de nouvelles idées vont surgir
2- En RPN
L'instruction ABS m'intrigue, elle permet effectivement de traiter le cas où l'utilisateur aurait saisie un nombre négatif.
Elle est donc facultative. Il y a peut-être moyen de gagner quelques pas en organisant différemment la sortie de boucle principale
Il est donc de la même taille que le code proposé par pcscote voir plus long si on économise l'instruction ABS et heureusement encore bien plus long que ma version.
Pour saisir X≠0? il faut utiliser la séquence de touches [XEQ] [ALPHA] [6] [_] [SIN] [_] [0] [3] [ALPHA], la touche [6] porte le caractère X, la touche [SIN] le H et le ≠ quand elle est préfixée et la touche [3] le ? final.
Ca ne marche pas car, contrairement au RPL, l'instruction de test X≠0? ne consomme pas son argument, ce qui fait que lorsque le 1 n'est pas inséré, le RDN drope le résultat du FRC et la soustraction ne se fait pas avec les bons arguments.
Pas facile de passer d'une machine à l'autre, les paradigmes de fonctionnement sont très différentes ou très proches mais piégés
Heureusement, bernouilli92 nous a donné une solution pour corriger ce code, utilisons FRC 2 * :
C'est malheureusement plus long
J'ai plus court pour HP-41C, mais j'attends encore un peu pour voir si les idées et code à venir ne vont pas là aussi m'obliger à réformer mon code.
J'attends aussi quelque exemple sur HP Classic ou Voyager dont l'usage de la pile sera certainement diffèrent.
3- En CASIO keystroke
Retirer la partie fractionnaire au résultat de la division est excellente, cela évite d'utiliser INT et simplifie énormément la boucle principale.
Mais tous ces GOTO, cela fait un peu spaghetti, je vais voir si un plat de nouilles ne serait pas moins copieux
4- En pocket BASIC
Tiens, bizarre encore rien
5- En AOS et autre keystroke TI
L'absence des TI-57/58/59 à chaque MPO devient inquiétante. Il y a-t-il encore de ces modèles en fonctionnement. C'est dommage, ce sont des machines qui avaient marquées par leurs performances l'histoire du calcul de poches.
Je vais préparer quelque chose sur ma TI-57 lcd.
Merci bernouilli92 pour ta réponse très rapide, comme souvent les utilisateurs de RPL sont les plus prompts à générer un code, toujours son système sous la main !bernouilli92 a écrit : ↑26 sept. 2020 21:07Code : Tout sélectionner
« 0 → N « WHILE DUP REPEAT 2 / DUP IP SWAP FP 2 * 'N' STO+ END DROP N » »
J'aime bien quelques astuces que tu utilises;
- utiliser une division par deux pour détecter la valeur des bits,
- utiliser une variable locale comme compteur c'est plus lisible qu'une version utilisant la pile et qui contiendra donc un certain nombre de SWAP, ROLL ou ROT ROT supplémentaires,
- enfin effectuer FP 2 * 'N' STO+ afin d'ajouter 0 ou 1 au compteur selon la résultat de la division
Par ailleurs, FP 2 * c'est un 2 MOD en un plus long.
Et je découvre que STO+ ne fonctionne pas sur HP-28S avec les variables locales
N'ayant pas d'HP-50g sous la main, je n'ai pas pu tester, mais j'ai un doute, je ne vois pas où le comptage des bits est effectuer ? D'ailleurs, je ne vois pas à quoi sert de remplacer les "1" par des "1" ?Gilles59 a écrit : ↑26 sept. 2020 21:34(UserRPL)(newRPL)Code : Tout sélectionner
« BIN R->B ->STR "1" DUP SREPL »
Code : Tout sélectionner
« #0b SWAP + ->STR "1" DUP SREPL »
Sur mon HP-28S (après avoir écrit un code pour palier à l'absence de la commande SREPL), en essayant 1968 j'obtiens "# 11110110000b" mais pas le nombre des bits à un
Il doit y avoir une astuce non documentée qui fait que SREPL compte les occurrences des "1" ? Je n'en ai pas trouvé trace dans la documentation fournie par HP :
Ah! Bien voilà une bonne idée transformer l'entier en entier binaire pour traiter le problème avec les instructions AND (logic AND) et SR (Shift Right) spécifiques et adaptées à ce type. Gros avantage, on peu alors aller compter jusqu'à des entiers de 64 bits; on pourrait alors vérifier que # 2305843009213693952d n'a que deux bits à un !Gege34 a écrit : ↑26 sept. 2020 22:19Code : Tout sélectionner
« #0d SWAP R→B WHILE DUP #0d ≠ REPEAT DUP #1d AND ROT + SWAP SR END DROP B→R »
Génial !
Sans la dernière instruction B→R , on aurait le résultat exprimé en binaire, décimal, octal ou hexadécimal selon le mode en cours. Je me rend compte qu'il n'est donc pas nécessaire de spécifier un mode (DEC BIN HEX OCT ) pour que ton code fonctionne
Effectivement #1b AND est une alternative à FP 2 * quelque soit le mode sélectionné. Par contre, n 1 AND ne fonctionne pas en mode normal car n'effectue pas d'arithmétique binaire et renvoi toujours 1 sauf si l'argument n est nul.
Vos codes m'ont obligés à revoir mon propre code RPL en profondeur qui comme celui de Gilles59 ne contient pas d'instruction WHILLE ... REPEAT ... END, mais qui comme ceux de Gege34 et bernouilli92 effectue une boucle WHILE/REPEAT.
Je vais attendre encore un peu avant de poster, je sens que de nouvelles idées vont surgir
2- En RPN
Voilà, une bonne idée utilisant 2 MOD et en effectuant le comptage directement dans un registre de la pile; J'ai eut la même idée.pcscote a écrit : ↑26 sept. 2020 22:21Code : Tout sélectionner
001 LBL "BC" 002 0 X<>Y ABS 005 LBL 00 006 INT X=0? GTO 01 009 ENTER↑ ENTER↑ 2 MOD ST+ Z RDN LASTX / GTO 00 018 LBL 01 019 RDN 020 END
L'instruction ABS m'intrigue, elle permet effectivement de traiter le cas où l'utilisateur aurait saisie un nombre négatif.
Elle est donc facultative. Il y a peut-être moyen de gagner quelques pas en organisant différemment la sortie de boucle principale
J'ai renuméroté de 002 à 019 car pour tester sur mon HP-41C, j'ai dû insérer un label LBL de début et un END de fin pour séparer ce code des autres codes en mémoire. Sur les HP il n'y a pas les zone de programme comme font les CASIO.Gilles59 a écrit : ↑26 sept. 2020 23:09Code : Tout sélectionner
002 0 STO 00 RDN 005*LBL 00 006 2 / X=0? GTO 99 010 ENTER↑ FRC X≠0? 1 014 ST+ 00 RDN - GTO 00 018*LBL 99 019 RCL 00
Il est donc de la même taille que le code proposé par pcscote voir plus long si on économise l'instruction ABS et heureusement encore bien plus long que ma version.
Pour saisir X≠0? il faut utiliser la séquence de touches [XEQ] [ALPHA] [6] [_] [SIN] [_] [0] [3] [ALPHA], la touche [6] porte le caractère X, la touche [SIN] le H et le ≠ quand elle est préfixée et la touche [3] le ? final.
Ca ne marche pas car, contrairement au RPL, l'instruction de test X≠0? ne consomme pas son argument, ce qui fait que lorsque le 1 n'est pas inséré, le RDN drope le résultat du FRC et la soustraction ne se fait pas avec les bons arguments.
Pas facile de passer d'une machine à l'autre, les paradigmes de fonctionnement sont très différentes ou très proches mais piégés
Heureusement, bernouilli92 nous a donné une solution pour corriger ce code, utilisons FRC 2 * :
Code : Tout sélectionner
001*LBL "b.G.C."
002 0 STO 00 RDN
005* LBL 00
006 2 / X=0? GTO 99
010 ENTER↑ FRC RCL X 2 * ST+ 00 RDN - GTO 00
020* LBL 99
021 RCL 00
022 END
J'ai plus court pour HP-41C, mais j'attends encore un peu pour voir si les idées et code à venir ne vont pas là aussi m'obliger à réformer mon code.
J'attends aussi quelque exemple sur HP Classic ou Voyager dont l'usage de la pile sera certainement diffèrent.
3- En CASIO keystroke
Utiliser la division par deux est une bonne idée. Je ne savais pas comment faire sur mon fx-602P, je vais suivre cette voie.Gilles59 a écrit : ↑26 sept. 2020 23:09Code : Tout sélectionner
[P0] MAC 001 LBL0 002 = / 2 - x=0 GOTO9 008 FRAC x=0 GOTO0 010 ISZ GOTO0 013 LBL9 014 MR00 015
Retirer la partie fractionnaire au résultat de la division est excellente, cela évite d'utiliser INT et simplifie énormément la boucle principale.
Mais tous ces GOTO, cela fait un peu spaghetti, je vais voir si un plat de nouilles ne serait pas moins copieux
4- En pocket BASIC
Tiens, bizarre encore rien
5- En AOS et autre keystroke TI
L'absence des TI-57/58/59 à chaque MPO devient inquiétante. Il y a-t-il encore de ces modèles en fonctionnement. C'est dommage, ce sont des machines qui avaient marquées par leurs performances l'histoire du calcul de poches.
Je vais préparer quelque chose sur ma TI-57 lcd.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
-
- Fonctionne à 2400 bauds
- Messages : 2142
- Enregistré le : 30 août 2011 12:23
- Localisation : Vous êtes ici -> .
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Tout a fait d'accord ! Les veberables TI sont absentes et c'est fort dommage, surtout la TI57, veritable merveille sur laquelle nombre d'entre-nous firent leurs premiers pas de programmation
Du coup, sur ma TI57 LED rouges:
Code : Tout sélectionner
00 32 1 STO 1
01 00 0
02 32 0 STO 0
03 22 x<>t
04 86 0 Lbl 0
05 02 2
06 -39 1 INV Prd 1
07 33 1 RCL 1
08 66 x=t
09 51 9 GTO 9
10 -49 INV Int
11 -34 1 INV SUM 1
12 34 0 SUM 0
13 34 0 SUM 0
14 51 0 GTO 0
15 86 9 Lbl 9
16 33 0 RCL 0
17 81 R/S
Modifié en dernier par cgh le 27 sept. 2020 11:49, modifié 2 fois.
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Intéressant ce MPO ;D Oui C.ret je pense que j'ai le même problème pour passer du RPL->RPN que ceux qui sont passé du RPN->RPL ;D Le RPL est plus logique (d'autres diront le contraire), en tout cas plus radical dans sa logique polonaise inverse. Il hérite plus du Forth que du RPN en fait. Dès que j'ai un peu de temps je vais lire le manuel dH41 et faire quelques tests, car là je souffre trop lol!
Voici une nouvelle version RPL et NewRPL :
Pour une mystérieuse raison, la 50g ne veut exécuter IDIV2 qu'en mode Radian (?). Le NewRPL s'en moque à juste titre
A propos d'IDIV2 :
Voici une nouvelle version RPL et NewRPL :
Code : Tout sélectionner
«
0 SWAP
DO 2 IDIV2 ROT + SWAP UNTIL DUP NOT END
DROP
»
A propos d'IDIV2 :
IDIV2
Type: Command
Description: For two integers, a and b, returns the integer part of a/b, and the remainder, r.
Input: Level 2 : a
Level 1 : b
Output: Level 2 : The integer part of a/b
Level 1 : The remainder
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
- bernouilli92
- Fonctionne à 14400 bauds
- Messages : 5230
- Enregistré le : 21 nov. 2012 13:03
- Localisation : Ile de France
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
@Gilles59 pourquoi pas un while au lieu d’un do? Cela permet d’éviter le not.
@C.Ret : j’ai utilisé FP 2 * car j’avais déjà divisé par 2 et je voulais réutiliser le résultat mais tu as raison, on peut économiser une opération en faisant le DUP avant la division par 2 et faire un 2 MOD ensuite :
@C.Ret : j’ai utilisé FP 2 * car j’avais déjà divisé par 2 et je voulais réutiliser le résultat mais tu as raison, on peut économiser une opération en faisant le DUP avant la division par 2 et faire un 2 MOD ensuite :
Code : Tout sélectionner
« 0 → N
«
WHILE DUP
REPEAT
DUP 2 / IP
SWAP 2 MOD 'N' STO+
END DROP N
»
»
HP, Casio, Sharp, Psion, quelques TI et divers autres
- dprtl
- Fonctionne à 1200 bauds
- Messages : 463
- Enregistré le : 27 janv. 2013 00:26
- Localisation : Strasbourg
- Contact :
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Voici ma méthode en Basic Casio (PB-1000, FX-850P, etc.), avec un nombre d'itérations réduit :
L'inconvénient, c'est que l'argument de la fonction embarquée HEX$() est limité à 65535. On pourrait en écrire une autre en assembleur
EDIT : un bug s'est glissé à la ligne 50, voir les réponses ci-après...
Code : Tout sélectionner
10 INPUT N:N$=HEX$(N):N=0
20 FOR I=1 TO 4:C$=MID$(N$,I,1)
30 IF C$="0" THEN 80
40 IF C$="F" THEN N=N+4:GOTO 80
50 IF C$="1" OR C$="4" OR C$="8" THEN N=N+1:GOTO 80
60 IF C$="7" OR C$="B" OR C$="D" OR C$="E" THEN N=N+3:GOTO 80
70 N=N+2
80 NEXT I:PRINT N
EDIT : un bug s'est glissé à la ligne 50, voir les réponses ci-après...
Modifié en dernier par dprtl le 27 sept. 2020 20:26, modifié 2 fois.
-
- Fonctionne à 2400 bauds
- Messages : 2142
- Enregistré le : 30 août 2011 12:23
- Localisation : Vous êtes ici -> .
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
Sur HP41C:
Le programme fait 36 octets avec le label; 27 sans le label "MPO96"
Code : Tout sélectionner
00 LBL "MPO96"
01 INT
02 CLST
03 LBL 00
04 X<> L
05 X=Y?
06 GTO 01
07 2
08 /
09 FRC
10 ST+ Z
11 ST+ Z
12 ST- L
13 GTO 00
14 LBL 01
15 X<> Z
16 END
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Re: Misez p'tit Optimisez n°96 : Combien de bits à un dans cet entier ?
En ce moment je suis sur Casio, donc une version en LMS (ça s'appelle bien comme ça, le langage des fx-7000G et famille ?) :
Code : Tout sélectionner
? -> N
0 -> B
Lbl 0
N / 2 -> D
Int D -> N
Frac D != 0 => Isz B
N > 0 => Goto 0
B
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.