Differenze tra le versioni di "Convertire un numero da Decimale in Binario"
Riga 30: | Riga 30: | ||
− | o anche il seguente (per convertire tipi di valori non 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() | ||
Riga 38: | Riga 38: | ||
i = 1257421 | i = 1257421 | ||
− | For b = 0 To | + | 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"; | ||
Riga 47: | Riga 47: | ||
Next | Next | ||
+ | '''End''' | ||
+ | |||
+ | |||
+ | Per convertire un numero di tipo ''Long'' (64 bit) 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 | ||
+ | |||
+ | |||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim numero As Long | ||
+ | Dim s As String | ||
+ | |||
+ | CreaSo() | ||
+ | |||
+ | numero = 1234567890123456789 | ||
+ | |||
+ | s = decbin(numero) | ||
+ | |||
+ | Print 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''' | '''End''' | ||
Versione delle 18:25, 7 apr 2017
Per convertire un numero da Decimale in rappresentazione binaria, sono possibili almeno tre modalità.
Indice
Uso della funzione Bin() di Gambas
Come è noto, si può far uso agevolmente dell'apposita 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 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 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 (64 bit) dovremo utilizzare 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 Public Sub Main() Dim numero As Long Dim s As String CreaSo() numero = 1234567890123456789 s = decbin(numero) Print 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.2.0"
Mostriamo un semplice esempio:
Library "libSDL2-2.0:0.2.0" ' 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