Non-decimal radices/Convert

From Rosetta Code
Revision as of 02:59, 7 March 2008 by 76.19.46.239 (talk) (note built-in is ok)
Task
Non-decimal radices/Convert
You are encouraged to solve this task according to the task description, using any language you may know.

Number Base Conversion is when you express a stored integer in a number base, such as in octal base 8 or binary base 2. It also is involved when you take a string representing a number in a given base and convert it to the stored integer form. Normally a stored integer is in binary, but that's typically invisible to the user, who normally enters or sees stored integers as decimal.

Write a function (or identify the built-in function) which is passed a non-negative integer to convert, and another integer representing the base. It returns a string containing the digits of the resulting number, without leading zeros except for the number 0 itself. For the digits beyond 9, one should use the lowercase english alphabet, where the digit a = 9+1, b = a+1, etc. The decimal number 26 expressed in base 16 would be 1a, for example.

Write a second function which is passed a string and a base, and it returns an integer representing that string interpreted in that base.

The two functions should each accept the output of the other. For example, k = 123456789; m = int(baseN(k,3),3); gives m==k. The programs may be limited by the word size or other such constraint of a given language, and do not need to do error checking for negatives, bases less than 2, or inappropriate digits.

Python

def baseN(num,b):
   return ((num == 0) and  "0" ) or ( baseN(num // b, b).lstrip("0") + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])
k = 26
s = baseN(k,16) # returns the string 1a
i = int('1a',16)  # returns the integer 26

JavaScript

k = 26
s = k.toString(16) //gives 1a
i = parseInt('1a',16) //gives 26
//optional special case for hex:
i = +('0x'+s) //hexadecimal base 16, if s='1a' then i=26.