Convertire un numero da Decimale in Binario: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 16: | Riga 16: | ||
l = 9223372036854775807 | l = 9223372036854775807 | ||
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 | ||
Next | |||
bb.Reverse | bb.Reverse | ||
Versione delle 20:17, 7 apr 2017
Per convertire un numero da Decimale in rappresentazione binaria, sono possibili almeno tre modalità.
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 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), 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
' 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.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