Convertir un entier en somme des carrés et en binaire

12 réponses
Avatar
Apitos
Bonjour =C3=A0 tous,

J=E2=80=99aimerais convertir un nombre entier en somme des carr=C3=A9s de 2=
puis en binaire, et inversement.

Exemple :

Si je saisi, dans une cellule le nombre 7, j=E2=80=99obtiens :=20

7 =3D 2exp0+2exp1+2exp2 =3D 111

Et si je saisi 111, j=E2=80=99obtiens :

111 =3D 2exp0+2exp1+2exp2 =3D 7

Merci d=E2=80=99avance.

10 réponses

1 2
Avatar
Michel__D
Bonjour,
Le 18/01/2020 à 14:41, Apitos a écrit :
Bonjour à tous,
J’aimerais convertir un nombre entier en somme des carrés de 2 puis en binaire, et inversement.
Exemple :
Si je saisi, dans une cellule le nombre 7, j’obtiens :
7 = 2exp0+2exp1+2exp2 = 111

Regarde la fonction DECBIN
Et si je saisi 111, j’obtiens :
111 = 2exp0+2exp1+2exp2 = 7

Regarde la fonction BINDEC
Avatar
Apitos
Bonjour MichD,
En essayant de convertir le nombre 512, ça donne une erreur #NOMBRE! a vec la fonction DECBIN()
Avatar
benoit
Apitos wrote:
Bonjour MichD,
En essayant de convertir le nombre 512, ça donne une erreur #NOMBRE! avec
la fonction DECBIN()

Il est limité à 9 bits.
À partir de là tu fais des divisions entières par 512 tu bascules le
reste en binaire et idem pour le diviseur, puis tu concatétène
bitDiv-bitReste. Cela te permettra d'aller jusqu'à 18bits. Pour aller
plus loin je te laisse chercher et trouver.
EN tout cas, si je ne m'abuse, ce n'est qu'une histoire d'additions ;
d'un certain point de vue.
--
Vie : n.f. maladie mortelle sexuellement transmissible
Benoît chez leraillez.com
Avatar
benoit
Michel__D wrote:
Re,
Le 18/01/2020 à 18:09, Apitos a écrit :
Bonjour MichD,

C'est une manie !!!
En essayant de convertir le nombre 512, ça donne une erreur #NOMBRE!
avec la fonction DECBIN()

Si tu avais regardé l'aide et comme la souligné Benoît c'est limité à un
certain nombre de caractère, mais tu peux te créer une fonction
personnalisée comme ceci :
Function DEC_BIN(Valeur As Variant, Optional NbCar As Long) As Variant
Dim iK As Long, sRet As String
iK = NbCar: sRet = ""
If iK = 0 Or iK > 30 Then iK = 30
If IsNumeric(Valeur) Then
Do While iK >= 0
sRet = sRet & Sgn((2 ^ iK) And Valeur)
iK = iK - 1
Loop
End If
If Len(sRet) = 0 Then
DEC_BIN = "#NOMBRE!"
Else
DEC_BIN = CDec(sRet)
End If
End Function

Merci pour le souligné (parce que sur Usenet le texte enrichi...) ;)
Sinon, je n'aime pas les macros & Co, même si j'ai écris pas mal
d'AppleScript, mais en utilisation interne pure et dure. Cela étant,
j'ai du mal à comprendre ton code. D'autant que tes variables sont
« imbitables » si tu me permets l'expression.
--
Vie : n.f. maladie mortelle sexuellement transmissible
Benoît chez leraillez.com
Avatar
Apitos
Bonjour Michel_D, Benoit, MichD,
Michel_D >> Je m’excuse pour ce désagrément !
Et merci pour ton code.
Merci également pour Benoit et MichD.
MichD >> j'ai du mal à comprendre ton code (Qui traite de différe ntes bases)
Entre temps, j'ai essayer de développer un code avec des fonctions et procédures personnalisées, mais reste à nettoyer et corriger quelques lignes (Enfin, je pense en tout cas) :
https://www.cjoint.com/c/JAswmrGc66u
Avatar
Michel__D
Le 18/01/2020 à 22:08, Benoît a écrit :
Michel__D wrote:
Re,
Le 18/01/2020 à 18:09, Apitos a écrit :
Bonjour MichD,

C'est une manie !!!
En essayant de convertir le nombre 512, ça donne une erreur #NOMBRE!
avec la fonction DECBIN()

Si tu avais regardé l'aide et comme la souligné Benoît c'est limité à un
certain nombre de caractère, mais tu peux te créer une fonction
personnalisée comme ceci :
Function DEC_BIN(Valeur As Variant, Optional NbCar As Long) As Variant
Dim iK As Long, sRet As String
iK = NbCar: sRet = ""
If iK = 0 Or iK > 30 Then iK = 30
If IsNumeric(Valeur) Then
Do While iK >= 0
sRet = sRet & Sgn((2 ^ iK) And Valeur)
iK = iK - 1
Loop
End If
If Len(sRet) = 0 Then
DEC_BIN = "#NOMBRE!"
Else
DEC_BIN = CDec(sRet)
End If
End Function

Merci pour le souligné (parce que sur Usenet le texte enrichi...) ;)
Sinon, je n'aime pas les macros & Co, même si j'ai écris pas mal
d'AppleScript, mais en utilisation interne pure et dure. Cela étant,
j'ai du mal à comprendre ton code. D'autant que tes variables sont
« imbitables » si tu me permets l'expression.

Il vaudrait mieux dire ce que tu ne comprends pas.
Mais je pense que tu devrais te pencher sur les opérateurs logigues.
Nota: pour ce qui concerne je suppose le noms des variables ben tu mets ce qui te fais plaisir ;)
Avatar
Apitos
Il vaudrait mieux dire ce que tu ne comprends pas.

Pour ton code, Michel__D, je n'ai pas compris ceci :
Sgn((2 ^ iK) And Valeur)
Avatar
Michel__D
Re,
Le 18/01/2020 à 23:56, Apitos a écrit :
Il vaudrait mieux dire ce que tu ne comprends pas.

Pour ton code, Michel__D, je n'ai pas compris ceci :
Sgn((2 ^ iK) And Valeur)

Comme dans la fonction DEC_BIN on veux avoir une représentation binaire (0 / 1) d'un nombre :
La fonction Sgn renvoie le signe de l'argument autrement dit :
Si l'argument < 0 Sgn = -1 => cas non pertinent pour notre traitement
Si l'argument = 0 Sgn = 0
Si l'argument > 0 Sgn = 1
Ensuite la formule ((2 ^ iK) And Valeur) renvoie pour chaque puissance de 2 => 0 si le bit
correspondant n'est pas positionné et différent de 0 si le bit correspondant est positionné ce qui
combiné à la fonction Sgn fournit le résultat attendu à savoir 0 ou 1.
J'espère que c'est plus clair, c'est quand même les bases de l'informatique.
Avatar
benoit
Michel__D wrote:
Le 18/01/2020 à 22:08, Benoît a écrit :
Michel__D wrote:
Re,
Le 18/01/2020 à 18:09, Apitos a écrit :
Bonjour MichD,

C'est une manie !!!
En essayant de convertir le nombre 512, ça donne une erreur #NOMBRE!
avec la fonction DECBIN()

Si tu avais regardé l'aide et comme la souligné Benoît c'est limité à un
certain nombre de caractère, mais tu peux te créer une fonction
personnalisée comme ceci :
Function DEC_BIN(Valeur As Variant, Optional NbCar As Long) As Variant
Dim iK As Long, sRet As String
iK = NbCar: sRet = ""
If iK = 0 Or iK > 30 Then iK = 30
If IsNumeric(Valeur) Then
Do While iK >= 0
sRet = sRet & Sgn((2 ^ iK) And Valeur)
iK = iK - 1
Loop
End If
If Len(sRet) = 0 Then
DEC_BIN = "#NOMBRE!"
Else
DEC_BIN = CDec(sRet)
End If
End Function

Merci pour le souligné (parce que sur Usenet le texte enrichi...) ;)
Sinon, je n'aime pas les macros & Co, même si j'ai écris pas mal
d'AppleScript, mais en utilisation interne pure et dure. Cela étant,
j'ai du mal à comprendre ton code. D'autant que tes variables sont
« imbitables » si tu me permets l'expression.

Il vaudrait mieux dire ce que tu ne comprends pas.
Mais je pense que tu devrais te pencher sur les opérateurs logigues.
Nota: pour ce qui concerne je suppose le noms des variables ben tu mets ce
qui te fais plaisir ;)

Bin non, mais varialbles ont un nom compréhensibles. Genre « sRet As
String ». Ok, sRet c'est du « texte », une liste de caractères
typographiques et non un nombre, mais c'est quoi ? C'est
incompréhensible en lecture simple.
« Dim iK As Long, sRet As String » :
- iK (une variable on ne peut plus succinte) est un 16, 32 bits ?
- SRet = "rien" (mais un vide de quoi ?)
- iK = NbCar : sRet je suppose donc que c'est le nombre de caractères
si...
J'arrête, c'est incompréhensible. Si tu regardes une peu de code tu
verras qu'il y a plus de lignes d'explication que de code.
Je ne remets pas en cause ce que tu as fait, loin de là. Imagine juste
que tu ais des dizaines de lignes comme ça à corriger pour un bug généré
beaucoup plus loin (genre sRet est une string alors qu'on parle de
nombres). Bref ton excellent boulot est incompréhensible parce que tu
n'as pas fait quelques petits trucs :
- Des noms « évidents » ;
- Des lignes d'explications avant chaque action.
Imgine que je t'envoie ce code dans deux ans et que je te demande à quoi
il sert ; combien de temps pour comprendre la situation au lieu de lire
quelques lignes de texte qui expliquent le problème puis les variables
qui sont évidentes en regard du problème.
Je parie qu'il ne soit pas sûr de rédiger ton code en moins de lignes,
par contre de façon compréhensible...
Exemples :
- C'est quoi Cdec ? Si c'est une fonction connue du code je ne dis
rien ;
- Je suppose que Len(sRet) est la « longueur » du texte sRet (puisque
c'est une string, donc pas un nombre) ;
- Si j'ai bien compris !!!!! (je n'en suis pas sûr)
If Len(sRet) = 0 Then
DEC_BIN = "#NOMBRE!"
Cela veut dire que si la cellule excel est vide tu dis « #NOMBRE! ».
Ce n'est pas bon comme réponse, tu dois dire, par exemple, « #VIDE! » ou
tout simplement laissé la case vide et « #TEXTE » si c'est un du texte
au lieu d'un nombre ; genre O au lieu de 0. Quand tu détectes une
erreur, justifie cette erreur. Cela sera utile tant pour l'utilisateur
futur, que pour toi.
Sinon, continue, ça fait plaisir de voir des gens aider les autres et
leur donner des « trucs » pour qu'il apprennent.
--
Vie : n.f. maladie mortelle sexuellement transmissible
Benoît chez leraillez.com
Avatar
Michel__D
Le 19/01/2020 à 01:24, Benoît a écrit :
Michel__D wrote:
Le 18/01/2020 à 22:08, Benoît a écrit :
Michel__D wrote:
Re,
Le 18/01/2020 à 18:09, Apitos a écrit :
Bonjour MichD,

C'est une manie !!!
En essayant de convertir le nombre 512, ça donne une erreur #NOMBRE!
avec la fonction DECBIN()

Si tu avais regardé l'aide et comme la souligné Benoît c'est limité à un
certain nombre de caractère, mais tu peux te créer une fonction
personnalisée comme ceci :
Function DEC_BIN(Valeur As Variant, Optional NbCar As Long) As Variant
Dim iK As Long, sRet As String
iK = NbCar: sRet = ""
If iK = 0 Or iK > 30 Then iK = 30
If IsNumeric(Valeur) Then
Do While iK >= 0
sRet = sRet & Sgn((2 ^ iK) And Valeur)
iK = iK - 1
Loop
End If
If Len(sRet) = 0 Then
DEC_BIN = "#NOMBRE!"
Else
DEC_BIN = CDec(sRet)
End If
End Function

Merci pour le souligné (parce que sur Usenet le texte enrichi...) ;)
Sinon, je n'aime pas les macros & Co, même si j'ai écris pas mal
d'AppleScript, mais en utilisation interne pure et dure. Cela étant,
j'ai du mal à comprendre ton code. D'autant que tes variables sont
« imbitables » si tu me permets l'expression.

Il vaudrait mieux dire ce que tu ne comprends pas.
Mais je pense que tu devrais te pencher sur les opérateurs logigues.
Nota: pour ce qui concerne je suppose le noms des variables ben tu mets ce
qui te fais plaisir ;)

Bin non, mais varialbles ont un nom compréhensibles. Genre « sRet As
String ». Ok, sRet c'est du « texte », une liste de caractères
typographiques et non un nombre, mais c'est quoi ? C'est
incompréhensible en lecture simple.
« Dim iK As Long, sRet As String » :
- iK (une variable on ne peut plus succinte) est un 16, 32 bits ?

Heu, iK As Long cela te parle pas ?
- SRet = "rien" (mais un vide de quoi ?)

J'initialise une chaîne de caractère (string), c'est du basique.
- iK = NbCar : sRet je suppose donc que c'est le nombre de caractères

NbCar est un argument passé lors de l'appel de la fonction que je vais réutiliser/modifier dans mon
code.
si...
J'arrête, c'est incompréhensible. Si tu regardes une peu de code tu
verras qu'il y a plus de lignes d'explication que de code.

Pour toi, vu le nombre de retour on peut estimer que les autres ont compris.
Je ne remets pas en cause ce que tu as fait, loin de là. Imagine juste
que tu ais des dizaines de lignes comme ça à corriger pour un bug généré
beaucoup plus loin (genre sRet est une string alors qu'on parle de
nombres). Bref ton excellent boulot est incompréhensible parce que tu

Visiblement tu n'as pas compris le code :
Lorsque l'on utilise le symbole de concaténation cela signifie que l'on travaille avec une chaîne
de caractère.
n'as pas fait quelques petits trucs :
- Des noms « évidents » ;

Comme déja dit, si le nom des variables ne te convient pas tu peux les changer.
- Des lignes d'explications avant chaque action.

J'agit en tant que bénévole et je propose une solution parmi d'autre et je ne prétends pas que
c'est LA SOLUTION
Ensuite pour les explications c'est plutôt une question de temps, mais rien ne t'interdit de le
documenter si tu utilise le code.
Imgine que je t'envoie ce code dans deux ans et que je te demande à quoi
il sert ; combien de temps pour comprendre la situation au lieu de lire
quelques lignes de texte qui expliquent le problème puis les variables
qui sont évidentes en regard du problème.
Je parie qu'il ne soit pas sûr de rédiger ton code en moins de lignes,
par contre de façon compréhensible...
Exemples :
- C'est quoi Cdec ? Si c'est une fonction connue du code je ne dis

regarde dans l'aide Excel.
Initialement Apitos souhaitait que :
7 = 2exp0+2exp1+2exp2 = 111
Or 111 ce n'est pas "111"
rien ;
- Je suppose que Len(sRet) est la « longueur » du texte sRet (puisque
c'est une string, donc pas un nombre) ;
- Si j'ai bien compris !!!!! (je n'en suis pas sûr)
If Len(sRet) = 0 Then
DEC_BIN = "#NOMBRE!"
Cela veut dire que si la cellule excel est vide tu dis « #NOMBRE! ».

Non cela veut dire que l'argument fourni n'est pas un nombre donc "#NOMBRE!" me semble plus
approprié, mais si tu préfère mettre "#VIDE" ou "#TEXTE" je ne t'en voudrais pas ;)
Ce n'est pas bon comme réponse, tu dois dire, par exemple, « #VIDE! » ou
tout simplement laissé la case vide et « #TEXTE » si c'est un du texte
au lieu d'un nombre ; genre O au lieu de 0. Quand tu détectes une
erreur, justifie cette erreur. Cela sera utile tant pour l'utilisateur
futur, que pour toi.
Sinon, continue, ça fait plaisir de voir des gens aider les autres et
leur donner des « trucs » pour qu'il apprennent.

J'essaye d'apporter modestement ma contribution.
1 2