dec2base and base2dec in Tutorials & Snippets
|
|
#define BASE_BINARY 2 #define BASE_QUATERNARY 4 #define BASE_OCTAL 8 #define BASE_DECIMAL 10 #define BASE_HEXADECIMAL 16 #define BASE_LIMIT 16
var/base_chars[]=\ list("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F") proc/base_getChar(var/char) return (base_chars.Find(char)-1) proc/base_pullPos(var/pos) return (base_chars[pos+1]) proc/string2list(var/string ) if(!string || !istext(string)) return string var/L[lentext(string)] for(var/i=1 to L.len) L[i] = copytext(string, i, i+1) return L
proc/bin2dec(var/number) return base2dec(number, BASE_BINARY) proc/quat2dec(var/number) return base2dec(number, BASE_QUATERNARY) proc/oct2dec(var/number) return base2dec(number, BASE_OCTAL) proc/hex2dec(var/number) return base2dec(number, BASE_HEXADECIMAL)
proc/base2dec(var/number, var/base=BASE_BINARY) if(!number || !istext(number)) return number ASSERT(base <= BASE_LIMIT && base >= BASE_BINARY) var/characters[] = string2list(uppertext(number)) var/result = 0 if(characters.len > 1) result = (base_getChar(characters[1]) * base) for(var/i=2 to characters.len-1) result = ((result + base_getChar(characters[i])) * base) return result + base_getChar(characters[characters.len])
proc/dec2bin(var/number) return dec2base(number, BASE_BINARY) proc/dec2quat(var/number) return dec2base(number, BASE_QUATERNARY) proc/dec2oct(var/number) return dec2base(number, BASE_OCTAL) proc/dec2hex(var/number) return dec2base(number, BASE_HEXADECIMAL)
proc/dec2base(var/number, var/base=BASE_BINARY) if(!number || !isnum(number)) return number ASSERT(base <= BASE_LIMIT && base >= BASE_BINARY) number = round(number) var/result = "" while(number) result = base_pullPos(number % base) + result number = round(number / base) return result
|
|