十进制的前十个自然数由0-9表达,而36进制的前36个自然数由0-9和a-z表达。三十六进制和十进制的对应关系如下,左边是十进制,右边是三十六进制:
0-0 1-1 2-2 3-3 4-4 5-5
6-6 7-7 8-8 9-9 10-a 11-b
12-c 13-d 14-e 15-f 16-g 17-h
18-i 19-j 20-k 21-l 22-m 23-n
24-o 25-p 26-q 27-r 28-s 29-t
30-u 31-v 32-w 33-x 34-y 35-z
我用代码制作了一张三十六进制的乘法表:
对比一下十进制的九九乘法表,就知道三十六进制的算数有多复杂了:
代码如下:
from string import ascii_lowercase
from string import digits
def log2(n):
return n.bit_length() - 1
def power_of_2(n):
return (n & (n-1) == 0) and n != 0
def to_base(num, base):
glyphs = digits + ascii_lowercase
if base < 2 or not isinstance(base, int):
return
sep = ','
if base == 60:
sep = ':'
elif base == 256:
sep = '.'
if power_of_2(base):
l = log2(base)
powers = range(num.bit_length() // l + (num.bit_length() % l != 0))
places = [(num >> l * i) % base for i in powers]
else:
if num == 0:
return ('0', base)
places = []
while num:
n, p = divmod(num, base)
places.append(p)
num = n
if base > 36:
return (sep.join(map(str, reversed(places))), base)
return (''.join([glyphs[p] for p in reversed(places)]), base)
import pandas as pd
import dataframe_image as dfi
table = []
for j in range(1,36):
temp = [to_base(j*i, 36)[0] for i in range(1,36)]
table.append(temp)
df = pd.DataFrame(table, columns = ['1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i',
'j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'],
index = ['1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i',
'j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'])
dfi.export(df,"base36.png",max_cols=-1)