Differenze tra le versioni di "Convertire un numero da rappresentazione binaria in decimale"

Da Gambas-it.org - Wikipedia.
 
(35 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per convertire un numero, espresso in formato a rappresentazione binaria, nella corrispondente rappresentazione ''decimale'', potremo utilizzare questo algoritmo|[[#Note|1]]|
+
=Conversione rapida con i caratteri '''&x'''=
'''Public''' Sub Button1_Click()
+
Una modalità rapida, per effettuare la conversione dalla rappresentazione binaria in quella decimale, è di anteporre alla rappresentazione binaria i simboli '''&x''', come segue:
 +
  Print &x11111110
 +
oppure, avendo la rappresentazione binaria in formato stringa, è di usare la funzione "Val()" e i predetti caratteri '''&x''':
 +
i = Val("&x11111110")
 
   
 
   
  Dim b, e As Integer  
+
 
Dim a As String 
+
=Conversione con il carattere '''%'''=
Dim Intero, InteroFinale As Integer 
+
Un'altra modalità prevede l'uso del carattere '''%''', anteponendolo alla rappresentazione binaria del valore da convertire:
  Dim Esponente, crt As Integer
+
  Print %11111110
 +
oppure, avendo la rappresentazione binaria in formato stringa, l'uso della funzione nativa "Val()" anteponendo alla stringa di caratteri della rappresentazione binaria il carattere '''%''':
 +
  Print Val("%11111110")
 +
 
 +
 
 +
=Uso di appositi algoritmi=
 +
Si potranno anche utilizzare specifici algoritmi.
 +
 
 +
=Introduzione generale=
 +
In via generale, per convertire un numero, espresso in formato a rappresentazione binaria in quella decimale, bisogna moltiplicare le cifre del numero binario per le potenze decrescenti di 2, e successivamente sommare i risultati.
 +
 
 +
Convertiamo, per esempio il numero binario 10101010:
 +
  (1 * 2<SUP>7</sup>) + (0 * 2<SUP>6</sup>) + (1 * 2<SUP>5</sup>) + (0 * 2<SUP>4</sup>) + (1 * 2<SUP>3</sup>) + (0 * 2<SUP>2</sup>) + (1 * 2<SUP>1</sup>) + (0 * 2<SUP>0</sup>) =
 
   
 
   
  a = InputBox("Immetti un numero in formato binario:")  
+
= (1 * 128) + (0 * 64) + (1 * 32) + (0 * 16) + (1 * 8) + (0 * 4) + (1 * 2) + (0 * 1) =
 
    
 
    
  Esponente = 0   
+
= 128 + 0 + 32 + 0 + 8 + 0 + 2 + 0 =
 +
 +
=  <FONT color=#B22222>170</font>
 +
 
 +
==Uso delle sole risorse di gambas==
 +
Con l'uso delle sole risorse di Gambas possiamo adottare almeno un paio di modalità.
 +
 
 +
===1<SUP>a</sup> modalità===
 +
'''Public''' Sub Main() 
 +
 +
  Dim s As String 
 +
  Dim bb As Byte[]
 +
  Dim b As Byte
 +
  Dim l As Long
 +
 +
  s = "01011010010110100101101001011010"
 +
 +
  bb = Byte[].FromString(s).Reverse()
 +
 +
  For b = 0 To bb.Max
 +
    l += Clong((bb[b] - 48) * (2 ^ b))
 +
  Next
 +
 +
  Print "Il corrispondente valore decimale è: "; l
 +
   
 +
'''End'''
 +
 
 +
===2<SUP>a</sup> modalità===
 +
'''Public''' Sub Main()
 +
 
 +
  Dim binario As String
 +
  Dim decimale As Long
 +
  Dim pos As Byte
 +
 
 +
  binario = "01011010010110100101101001011010"
 +
   
 +
  Repeat
 +
    decimale += Mid(binario, Len(binario) - pos, 1) * (2 ^ pos)
 +
    Inc pos
 +
  Until pos == Len(binario)
 
      
 
      
   For b = Len(a) To 1 Step -1 
+
   Print decimale
 
    
 
    
    crt = Int(Val(Mid(a, b, 1)))   
+
'''End'''
    Intero = crt * 2 ^ Esponente  
+
 
    Esponente += 1  
+
==Uso della funzione esterna "strtol()"==
    InteroFinale = InteroFinale + Intero  
+
La funzione ''strtol( )'', dichiarata nel file header "''/usr/include/stdlib.h''", converte un numero da rappresentazione stringa in un valore di tipo "''long int''", come definito nel file header "''/usr/include/limits.h''"
   
+
 
   Next 
+
Dunque si passerà a detta funzione esterna una stringa contenente la rappresentazione binaria del valore da convertire, avendo cura di porre il terzo parametro della funzione medesima a 2 (base binaria).
 +
 
 +
Mostriamo un semplice esempio:
 +
Library "libc:6"
 +
   
 +
<FONT Color=gray>' ''long int strtol (const char *__restrict __nptr, char **__restrict __endptr, int __base)''
 +
' ''Convert a string to a long integer.''</font>
 +
Private Extern strtol(__nptr As String, __endptr As Pointer, __base As Integer) As Long
 +
   
 +
   
 +
  '''Public''' Sub Main()
 +
 
 +
  Dim binario As String
 +
   Dim l As Long
 
    
 
    
  Print InteroFinale
+
<FONT Color=gray>' ''Come esempio passiamo la rappresentazione binaria del valore massimo supportato dal tipo "Long" nativo di Gambas: 9223372036854775807''</font>
+
  binario = "111111111111111111111111111111111111111111111111111111111111111"
 +
     
 +
  l = strtol(binario, 0, 2)
 +
 
 +
  Print l
 +
 
 
  '''End'''
 
  '''End'''
  
  
  
=Note=
+
=Riferimenti=
[1] Il presente algoritmo è stato suggerito dall'utente ''Picavbg'' del forum di Gambas-it.org.
+
* https://cplusplus.com/reference/cstdlib/strtol/
 +
* https://www.tutorialspoint.com/c_standard_library/c_function_strtol.htm

Versione attuale delle 14:36, 15 ago 2022

Conversione rapida con i caratteri &x

Una modalità rapida, per effettuare la conversione dalla rappresentazione binaria in quella decimale, è di anteporre alla rappresentazione binaria i simboli &x, come segue:

Print &x11111110

oppure, avendo la rappresentazione binaria in formato stringa, è di usare la funzione "Val()" e i predetti caratteri &x:

i = Val("&x11111110")

Conversione con il carattere %

Un'altra modalità prevede l'uso del carattere %, anteponendolo alla rappresentazione binaria del valore da convertire:

Print %11111110

oppure, avendo la rappresentazione binaria in formato stringa, l'uso della funzione nativa "Val()" anteponendo alla stringa di caratteri della rappresentazione binaria il carattere %:

Print Val("%11111110")


Uso di appositi algoritmi

Si potranno anche utilizzare specifici algoritmi.

Introduzione generale

In via generale, per convertire un numero, espresso in formato a rappresentazione binaria in quella decimale, bisogna moltiplicare le cifre del numero binario per le potenze decrescenti di 2, e successivamente sommare i risultati.

Convertiamo, per esempio il numero binario 10101010:

(1 * 27) + (0 * 26) + (1 * 25) + (0 * 24) + (1 * 23) + (0 * 22) + (1 * 21) + (0 * 20) =

= (1 * 128) + (0 * 64) + (1 * 32) + (0 * 16) + (1 * 8) + (0 * 4) + (1 * 2) + (0 * 1) =
 
= 128 + 0 + 32 + 0 + 8 + 0 + 2 + 0 =

=  170

Uso delle sole risorse di gambas

Con l'uso delle sole risorse di Gambas possiamo adottare almeno un paio di modalità.

1a modalità

Public Sub Main()  

  Dim s As String  
  Dim bb As Byte[]
  Dim b As Byte
  Dim l As Long

  s = "01011010010110100101101001011010"

  bb = Byte[].FromString(s).Reverse()

  For b = 0 To bb.Max
    l += Clong((bb[b] - 48) * (2 ^ b))
  Next

  Print "Il corrispondente valore decimale è: "; l

End

2a modalità

Public Sub Main()
 
  Dim binario As String
  Dim decimale As Long
  Dim pos As Byte
  
  binario = "01011010010110100101101001011010"
   
  Repeat
    decimale += Mid(binario, Len(binario) - pos, 1) * (2 ^ pos)
    Inc pos
  Until pos == Len(binario)
   
  Print decimale
  
End

Uso della funzione esterna "strtol()"

La funzione strtol( ), dichiarata nel file header "/usr/include/stdlib.h", converte un numero da rappresentazione stringa in un valore di tipo "long int", come definito nel file header "/usr/include/limits.h"

Dunque si passerà a detta funzione esterna una stringa contenente la rappresentazione binaria del valore da convertire, avendo cura di porre il terzo parametro della funzione medesima a 2 (base binaria).

Mostriamo un semplice esempio:

Library "libc:6"

' long int strtol (const char *__restrict __nptr, char **__restrict __endptr, int __base)
' Convert a string to a long integer.
Private Extern strtol(__nptr As String, __endptr As Pointer, __base As Integer) As Long


Public Sub Main()
 
  Dim binario As String
  Dim l As Long
 
' Come esempio passiamo la rappresentazione binaria del valore massimo supportato dal tipo "Long" nativo di Gambas: 9223372036854775807
  binario = "111111111111111111111111111111111111111111111111111111111111111"
      
  l = strtol(binario, 0, 2)
  
  Print l
  
End


Riferimenti