字符26进制 与 10进制【可以这样来理解】

生活,应用中,会遇到一类极有规律的字符序列,像这样:

ABCDAA……AZ……AAA……ZZZ……

在这里插入图片描述

一琢磨,跟数制很像,但又不全是,那么列出一部分对比看看

在这里插入图片描述

于是,不妨使 A-Z 分别对应 0-25

通过统计,可以先算出几个特殊的值,比如AA对应26, AZ对应51,列个表吧

在这里插入图片描述

AA26
AZ26+25=51
AAA1X26X26+1X26+0=702
AAZ1X26X26+1X26+25=727

分析以后,可以发现,当字母位于“个位”时,所代表的就是它对应的数即 A-Z~0-25,“十位”上的A-Z,按数制的话应该是代表(0~25)x26,但事实上是(1~26)x26,所以按照数字数制来算的话,比如 26(AA) 上短除法在这里插入图片描述

这样的话,算出来是 10, 对应到字母,就是 BA。

本来应该是AA,但是十位却变成了B,成了BA,一对比,跟刚刚的统计规律不谋而合,除了“个位”,其它高位上,A-Z 对应的是 1-26 而不是 0-26

在这里插入图片描述

- 那么,就可以根据一个字符26进制数,计算出对应的10进制,比如 ABZ = 1x26^2+2x26+25

编程这样实现
chr26 = 'AAZ'
num10 = 0
for i in range(ln:=len(chr26)):
	if i-ln+1:
		num10 += (ord(chr26[i])-65+1)*26**i
	else:
		num10 += ord(chr26[i])-65
print(num10)

- 那么问题又来了,怎么把10进制转换为 字符26进制 呢??!!!【直接按数制来已经证明不行了,头大】

在这里插入图片描述

冷静分析,按前面的分析,短除法也能用,只是除了个位上,其它位数都比实际多了一个单位,那么就好办了,照样用短除法,只不过算出来的数,除了个位上的,其余都要减去 1,要是算出来0,再减1那不是-1?!!,不,在这里0-1=25,那么如何实现,如下

#这还是26个字母顺序组成的序列 A-Z
chr26 = [chr(65 + i) for i in range(26)]
# zh用于储存输出的 10进制字符
zh = ''
while x!=-1:
    zh = chr26[x % 26] + zh
    x = x // 26 - 1
print(zh)

到这里,说好的算出来再 -1呢,怎么变成 x = x // 26 - 1 了,不急,x 经过 x//26 运算后,得到的数用于下一次短除法,但是这样算下去,会有几个问题,比如 26*26(ZA),要是算完再 减1, 那么就是 0 25 0 (AZA)那就坏了,

  • 【算完还要减1的问题】 所以就先把 x//26 后再减去 1,这样就会使得下一次计算所得的余数比正规短除法少着1【很容易理解,5//3=2, (5-1)/3=5//3-1//3=2-1】

  • 【算完减1出现 “-1”的问题】把 x//26 后再减去 1,就避免了出现-1的问题,出现-1是因为计算某高位是出现 n26//26 = 0, 如果上一步就 x//26 后再减去 1,那么会得到【(n26-1)//26 = (n-1)*26//26 + (26-25)//26 = 25】,同时,这样也避免了26*26 计算出来得到AZA(多出一高位A)因为先减去1,自然就到不了高位【类似于先减1 ,不够除的话已经向高位借位】

在这里插入图片描述

是有点绕,不过我这种思路的根本还是那张表,细细品一下,发现也不那么绕

PIL Image.paste() 透明像素问题

图片变字符画,其实很简单

干货!Windows频幕二维码识别小工具

python 图片拼接、图片转pdf

今日头条美图爬取,有你想要的

python 精美壁纸、简单爬虫,告别壁纸荒

Python 图片拼心,表白利器

Python 以字成图,花式表白,脱单趁早

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将十六字符串转换成二字符串,可以根据以下步骤行操作: 1. 首先,将十六字符串的每一个字符单独转换成一个四位的二字符串,然后拼接成一个完整的二字符串。可以使用类似于引用中的方法来实现这个步骤。 2. 确保二字符串的长度是4的倍数。如果不是,可以在字符串的开头补零,直到长度满足要求。 3. 将二字符串的每四位转换成一位十六字符,最后拼接在一起。可以使用类似于引用中的方法来实现这个步骤。 举个例子来说明这个过程。假设我们有一个十六字符串 "A1": 1. 首先,将十六字符 "A" 转换成二字符串 "1010",将十六字符 "1" 转换成二字符串 "0001"。然后将这两个二字符串拼接在一起,得到完整的二字符串 "10100001"。 2. 由于这个二字符串的长度是8,不是4的倍数,所以我们在开头补零,得到长度为12的二字符串 "000010100001"。 3. 然后将这个二字符串的每四位转换成一位十六字符。首先,将前四位 "0000" 转换成十六字符 "0",然后将后四位 "1010" 转换成十六字符 "A",最后拼接在一起,得到转换后的十六字符串 "0A"。 所以,将十六字符串 "A1" 转换成二字符串的结果是 "000010100001",将二字符串 "000010100001" 转换回十六字符串的结果是 "0A"。 希望这个例子能帮助你理解如何将十六字符串转换成二字符串。如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的壳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值