Differenze tra le versioni di "Convertire un numero da Decimale in Binario"

Da Gambas-it.org - Wikipedia.
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per convertire un numero da Decimale in rappresentazione binaria, sono possibili almeno tre modalità.
+
Per convertire un numero da Decimale in rappresentazione binaria, sono possibili alcune modalità.
 +
==Uso della funzione "Bin()"==
 +
Come è noto, si può far uso agevolmente dell'apposita [[Bin$|funzione Bin()]]:
 +
Public Sub Main()
 +
 +
  Print Bin(1000, 16)
 +
 +
End
  
  
===Uso della funzione ''Bin()'' di Gambas===
+
==Uso della funzione "Base()"==
Come è noto, si può far uso agevolmente dell'apposita [[Bin$|funzione Bin()]].
+
Si può far uso anche della funzione "Base()", la quale restituisce la rappresentazione stringa di un numero in base definita nel 2° parametro, che deve essere un numero compreso fra 2 e 36.  
 +
Public Sub Main()
 +
 +
  Print Base(1000, 2)
 +
 +
End
  
  
===Uso di apposito algoritmo===
+
==Uso di apposito algoritmo==
 
Volendo, è ovviamente possibile raggiungere il medesimo risultato con apposito codice, come ad esempio il seguente:
 
Volendo, è ovviamente possibile raggiungere il medesimo risultato con apposito codice, come ad esempio il seguente:
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim l As Long
 
   Dim l As Long
Riga 14: Riga 26:
 
   Dim b As Byte
 
   Dim b As Byte
 
    
 
    
  l = 9223372036854775807
+
  l = 9223372036854775807
 
    
 
    
  While l > 0
+
  for b = 0 To (SizeOf(gb.Long) * 8) - 1
    bb.Add(CByte(l Mod 2))
+
    bb.Add(CByte(l Mod 2))
    l \= 2
+
    l \= 2
  Wend
+
  Next
 
   
 
   
  bb.Reverse
+
  bb.Reverse
 
    
 
    
  For b = 0 To bb.Max
+
  For b = 0 To bb.Max
    Print bb[b];
+
    Print bb[b];
  Next
+
  Next
   
+
   
  '''End'''
+
  End
 
 
 
 
 
o anche il seguente (per convertire tipi di valori <SPAN Style="text-decoration:underline">non</span> superiori a 32 bit):
 
o anche il seguente (per convertire tipi di valori <SPAN Style="text-decoration:underline">non</span> superiori a 32 bit):
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim b As Byte
 
   Dim b As Byte
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
  i = 1257421
+
  i = 1257421
 
    
 
    
  For b = 0 To (SizeOf(gb.Integer) * 8) - 1
+
  For b = 0 To (SizeOf(gb.Integer) * 8) - 1
    If i And (&80000000& \ CInt(2 ^ b)) Then
+
    If i And (&80000000& \ CInt(2 ^ b)) Then
      Print "1";
+
      Print "1";
    Else
+
    Else
      Print "0";
+
      Print "0";
    Endif
+
    Endif
     
+
     
  Next
+
  Next
 
+
 
  '''End'''
+
  End
  
  
Per convertire un numero di tipo ''Long'', o comunque di un tipo di dimensione fino a 64 bit (quindi dal ''Byte'' fino al ''Long''), dovremo utilizzare un'apposita funzione da noi scritta in linguaggio C ed inserita in una libreria dinamica condivisa .so esterna.
+
Per convertire un numero di tipo ''Long'', o comunque di un tipo di dimensione fino a 64 bit (quindi dal ''Byte'' fino al ''Long''), possiamo utilizzare - oltre al primo esempio già visto sopra - anche un'apposita funzione da noi scritta in linguaggio C ed inserita in una libreria dinamica condivisa .so esterna.
 
  Library "/tmp/lib"
 
  Library "/tmp/lib"
 
   
 
   
Riga 62: Riga 72:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim numero As Long
 
   Dim numero As Long
 
   Dim s As String
 
   Dim s As String
 
    
 
    
  CreaSo()
+
  CreaSo()
 
      
 
      
  numero = 1234567890123456789
+
  numero = 1234567890123456789
 
    
 
    
  s = decbin(numero)
+
  s = decbin(numero)
 
      
 
      
  Print s
+
  Print s
 
    
 
    
 
  <FONT Color=gray>' ''Libera l'area di memoria precedentemente allocata nel codice scritto in C:''</font>
 
  <FONT Color=gray>' ''Libera l'area di memoria precedentemente allocata nel codice scritto in C:''</font>
  free_C(VarPtr(s))
+
  free_C(VarPtr(s))
 
+
 
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure CreaSo()
+
  Private Procedure CreaSo()
 
    
 
    
 
   File.Save("/tmp/lib.c", "#include <stdlib.h>\n\n#include <limits.h>\n\n" &
 
   File.Save("/tmp/lib.c", "#include <stdlib.h>\n\n#include <limits.h>\n\n" &
Riga 94: Riga 104:
 
   Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
 
   Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
 
    
 
    
  '''End'''
+
  End
  
  
 +
==Uso della funzione esterna ''SDL_ltoa()'' del API di SDL2==
 +
E' inoltre possibile far uso della funzione esterna "ltoa()" del API di SDL2.
  
===Uso della funzione esterna ''SDL_ltoa()'' del API di SDL2===
+
In tal caso sarà necessario installare nel sistema e richiamare nell'applicazione Gambas la libreria dinamica e condivisa: "''libSDL2-2.0.so.0.18.2'' ".
E' inoltre possibile far uso della funzione esterna ''ltoa()'' del API di SDL2.
 
 
 
In tal caso sarà necessario installare nel sistema e richiamare nell'applicazione Gambas la libreria dinamica e condivisa: "''libSDL2-2.0.so.0.2.0''"
 
  
  
 
Mostriamo un semplice esempio:
 
Mostriamo un semplice esempio:
  Library "libSDL2-2.0:0.2.0"
+
  Library "libSDL2-2.0:0.18.2"
 
   
 
   
 
  <FONT Color=gray>' ''char * SDL_ltoa(long value, char * string, int radix)''</font>
 
  <FONT Color=gray>' ''char * SDL_ltoa(long value, char * string, int radix)''</font>
Riga 111: Riga 120:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim p As Pointer
 
   Dim p As Pointer
 
    
 
    
  p = Alloc(64)
+
  p = Alloc(64)
 
    
 
    
  SDL_ltoa(123456789, p, 2)
+
  SDL_ltoa(123456789, p, 2)
 
    
 
    
  Print String@(p)
+
  Print String@(p)
 
    
 
    
  Free(p)
+
  Free(p)
 
   
 
   
  '''End'''
+
  End
 +
 
  
  
====Riferimenti====
+
=Riferimenti=
 
https://fossies.org/dox/SDL2-2.0.3/SDL__string_8c.html
 
https://fossies.org/dox/SDL2-2.0.3/SDL__string_8c.html

Versione attuale delle 08:23, 29 set 2023

Per convertire un numero da Decimale in rappresentazione binaria, sono possibili alcune modalità.

Uso della funzione "Bin()"

Come è noto, si può far uso agevolmente dell'apposita funzione Bin():

Public Sub Main()

 Print Bin(1000, 16)

End


Uso della funzione "Base()"

Si può far uso anche della funzione "Base()", la quale restituisce la rappresentazione stringa di un numero in base definita nel 2° parametro, che deve essere un numero compreso fra 2 e 36.

Public Sub Main()

 Print Base(1000, 2)

End


Uso di apposito algoritmo

Volendo, è ovviamente possibile raggiungere il medesimo risultato con apposito codice, come ad esempio il seguente:

Public Sub Main()

 Dim l As Long
 Dim bb As New Byte[]
 Dim b As Byte
 
 l = 9223372036854775807
 
 for b = 0 To (SizeOf(gb.Long) * 8) - 1
   bb.Add(CByte(l Mod 2))
   l \= 2
 Next

 bb.Reverse
  
 For b = 0 To bb.Max
   Print bb[b];
 Next
   
End

o anche il seguente (per convertire tipi di valori non superiori a 32 bit):

Public Sub Main()
 
 Dim b As Byte
 Dim i As Integer
 
 i = 1257421
  
 For b = 0 To (SizeOf(gb.Integer) * 8) - 1
   If i And (&80000000& \ CInt(2 ^ b)) Then
     Print "1";
   Else
     Print "0";
   Endif
     
 Next
 
End


Per convertire un numero di tipo Long, o comunque di un tipo di dimensione fino a 64 bit (quindi dal Byte fino al Long), possiamo utilizzare - oltre al primo esempio già visto sopra - anche un'apposita funzione da noi scritta in linguaggio C ed inserita in una libreria dinamica condivisa .so esterna.

Library "/tmp/lib"

' char *decbin(long num)
' Converte un numero da rappresentazione decimale a rappresentazione binaria a 64 bit.
Private Extern decbin(num As Long) As String

' void free (void *__ptr)
' Free a block allocated by `malloc', `realloc' or `calloc'.
Private Extern free_C(__ptr As Pointer) In "libc:6" Exec "free" 


Public Sub Main()
  
 Dim numero As Long
 Dim s As String
 
 CreaSo()
   
 numero = 1234567890123456789
 
 s = decbin(numero)
   
 Print s
  
' Libera l'area di memoria precedentemente allocata nel codice scritto in C:
 free_C(VarPtr(s))
 
End


Private Procedure CreaSo()
 
 File.Save("/tmp/lib.c", "#include <stdlib.h>\n\n#include <limits.h>\n\n" &
           "const unsigned long int PARAGONE = 9223372036854775808UL;\n" &
           "char *decbin(long num) {\n\n" &
           "   char *stringa = calloc(65, sizeof(char));\n\n\n" &
           "   char n;\n\n" &
           "   for (n=0; n<64; n++)\n" &
           "       stringa[n] = num & (PARAGONE >> n) ? '1' : '0';\n\n" &
           "   return stringa;\n\n}")
 
 Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
 
End


Uso della funzione esterna SDL_ltoa() del API di SDL2

E' inoltre possibile far uso della funzione esterna "ltoa()" del API di SDL2.

In tal caso sarà necessario installare nel sistema e richiamare nell'applicazione Gambas la libreria dinamica e condivisa: "libSDL2-2.0.so.0.18.2 ".


Mostriamo un semplice esempio:

Library "libSDL2-2.0:0.18.2"

' char * SDL_ltoa(long value, char * string, int radix)
Private Extern SDL_ltoa(value As Integer, strP As Pointer, radix As Integer)


Public Sub Main()

 Dim p As Pointer
 
 p = Alloc(64)
  
 SDL_ltoa(123456789, p, 2)
  
 Print String@(p)
  
 Free(p)

End


Riferimenti

https://fossies.org/dox/SDL2-2.0.3/SDL__string_8c.html