Es muy fácil, sencillísimo, si sabes como funcionan los números binarios. Todo se reduce a ir hallando los restos de la división por 2 y luego mostrar esos restos en el orden inverso al que fueron hallados. Si necesitas números octales (base 8) entonces en lugar de 2 deberías usar 8 en los cálculos. Si necesitas números hexadecimales (base 16) entonces en lugar de 2 deberías usar 16 en los cálculos. La lógica es siempre la misma, lo único que cambia es la base.
Te hice un pequeño programita para mostrarlo, pero lo hice más general, para que muestre no solamente números binarios sino también octales y hexadecimales. Así te resultará más útil.
CLEAR
For lnI = 1 to 3
lnBase = icase(lnI == 1, 2, lnI == 2, 8, 16)
? icase(lnBase == 2, "BINARIO", lnBase == 8, "OCTAL", "HEXADECIMAL")
? "----------------------"
? DECIMAL_A_OTRA_BASE( 6, lnBase)
? DECIMAL_A_OTRA_BASE( 12, lnBase)
? DECIMAL_A_OTRA_BASE( 15, lnBase)
? DECIMAL_A_OTRA_BASE( 25, lnBase)
? DECIMAL_A_OTRA_BASE( 40, lnBase)
? DECIMAL_A_OTRA_BASE( 50, lnBase)
? DECIMAL_A_OTRA_BASE( 65, lnBase)
? DECIMAL_A_OTRA_BASE(100, lnBase)
? DECIMAL_A_OTRA_BASE(128, lnBase)
? DECIMAL_A_OTRA_BASE(200, lnBase)
?
Next lnI
RETURN
*
*
FUNCTION DECIMAL_A_OTRA_BASE
LParameters tnNumDec, tnBase
Local lnCociente, lnResto, lcDigito, lcResultado
tnNumDec = Abs(Int(tnNumDec))
tnBase = iif(VarType(tnBase) <> "N", 2, tnBase)
lcResultado = ""
if !InList(tnBase, 2, 8, 16)
Return("***")
endif
lnCociente = Int(tnNumDec / tnBase)
lnResto = Mod(tnNumDec, tnBase)
tnNumDec = lnCociente
do while tnNumDec > 0
lcDigito = iif(tnBase == 2 .or. tnBase == 8 .or. lnResto <= 9, Transform(lnResto), CHR(55 + lnResto))
lcResultado = lcDigito + lcResultado
lnCociente = Int(tnNumDec / tnBase)
lnResto = Mod(tnNumDec, tnBase)
tnNumDec = lnCociente
enddo
lcDigito = iif(tnBase == 2 .or. tnBase == 8 .or. lnResto <= 9, Transform(lnResto), CHR(55 + lnResto))
lcResultado = lcDigito + lcResultado
Return(lcResultado)
*
*
Saludos.
Walter.
"Si puedes razonar con gente religiosa, no son gente religiosa". Dr. House