Convertire un numero da Decimale in Binario: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
 
(7 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()]]:
===Uso della funzione ''Bin()'' di Gambas===
  Public Sub Main()
Come è noto, si può far uso agevolmente dell'apposita [[Bin$|funzione Bin()]].
 
 
===Uso di apposito algoritmo===
Volendo, è ovviamente possibile raggiungere il medesimo risultato con apposito codice, come ad esempio il seguente:
  '''Public''' Sub Main()
   
   
   Dim i As Integer
   Print <FONT Color=red>Bin</font>(1000, 16)
  Dim bb As New Byte[]
  Dim b As Byte
 
  i = 123456789
 
  While i > 0
    bb.Add(CByte(i Mod 2))
    i \= 2
  Wend
   
   
  bb.Reverse
  End
 
  For b = 0 To bb.Max
    Print bb[b];
  Next
   
  '''End'''




o anche il seguente (per convertire tipi di valori <SPAN Style="text-decoration:underline">non</span> superiori a 32 bit):
==Uso della funzione "Base()"==
'''Public''' Sub Main()
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()
  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''), dovremo utilizzare un'apposita funzione da noi scritta in linguaggio C ed inserita in una libreria dinamica condivisa .so esterna.
Library "/tmp/lib"
<FONT Color=gray>' ''char *decbin(long num)''
' ''Converte un numero da rappresentazione decimale a rappresentazione binaria a 64 bit.''</font>
Private Extern decbin(num As Long) As String
<FONT Color=gray>' ''void free (void *__ptr)''
' ''Free a block allocated by `malloc', `realloc' or `calloc'.''</font>
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
 
<FONT Color=gray>' ''Libera l'area di memoria precedentemente allocata nel codice scritto in C:''</font>
  free_C(VarPtr(s))
 
'''End'''
   
   
  Print Base(1000, 2)
   
   
  '''Private''' Procedure CreaSo()
  End
 
  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.


===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 condivisa: "''libSDL2-2.0.so.0.3000.7'' ".
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.3000.7"
   
   
  <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 30:
   
   
   
   
  '''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 02:29, 31 ott 2024

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 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 condivisa: "libSDL2-2.0.so.0.3000.7 ".

Mostriamo un semplice esempio:

Library "libSDL2-2.0:0.3000.7"

' 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