开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1438|回复: 7
收起左侧

[分享] 进制转换思想超简单

[复制链接]
结帖率:50% (1/2)
发表于 2023-3-20 20:46:32 | 显示全部楼层 |阅读模式   广西壮族自治区贵港市
本帖最后由 wlp 于 2023-3-20 21:23 编辑

进制转换任意进制都可以,就是一个推箱子的游戏。

利用位运算中的左移,右移,位与就行

首先位运算是2进制的
左移1位,相当于 "值*2"
右移1位,相当于 "值/2"
位与最后1位,相当于 "值%2" 或者 进制数最大值(也就是进制数-1, 这里是1)

在16进制中对应就是(其他进制,只要把16换成对应的进制就像)
左移1位,相当于 "值*16"
右移1位,相当于 "值/16"
位与最后1位,相当于 "值%16" 或者 进制数最大值(也就是进制数-1, 这里是F(15))


16进制转10进制
原数:5F102
5左移4位得到50000
F左移3位得到F000
1左移2位得到100
0左移1位得到00
2左移0位得到2

最终计算出
50000 + F000 + 100 + 00 + 2 = 5F102

然后把上面的算式套用转换成计算机运行表达式

把进制查表得到10进制数
5 => 5
F => 15
1 => 1
0 => 0
2 => 2
然后再转换表达式
5左移4位得到50000 => (5 * (16^4))
F左移3位得到F000 => (15 * (16^3))
1左移2位得到100 => (1 * (16^2))
0左移1位得到00 => (0 * (16^1))
2左移0位得到2 => 2  这里直接用原数,不用求次方,因为16^0的结果是1,会导致错误

(5 * (16^4)) + (15 * (16^3)) + (1 * (16^2)) +  (0 * (16^1)) + 2 = 389378(5F102)

那10进制怎么转16进制呢

比如10进制数389378,首先我们要把当成389378一个16进制数5F102看待
二进制中位于1,就是取最右边1位,16进制中位与F(15),比较难计算那就用 值%16 计算位与(%16中的16是10进制)

通过循环 位与取出值,右移原数就能得到

原数 = 5F102

(5F102 & F)  = (5F102 % 16) = 2  (取出值)
(5F102 >> 1)  = (5F102 / 16) = 5F10  (原数)

(5F10 & F)  = (5F10 % 16) = 0  (取出值)
(5F10 >> 1)  = (5F10 / 16) = 5F1  (原数)

(5F1 & F)  = (5F1 % 16) = 1  (取出值)
(5F1 >> 1)  = (5F1 / 16) = 5F  (原数)


(5F & F)  = (5F % 16) = F  (取出值)
(5F >> 1)  = (5F / 16) = 5  (原数)


(5 & F)  = (5 % 16) = 5  (取出值)
(5 >> 1)  = (5 / 16) = 0  (原数)


最终得到201F5,然后翻转变成 5F102,10进制转16进制就完成了

什么把389378当成5F102看待是什么鬼,利用同一个数,同乘除加减结果相同原理呗

389378 / 16 == 5F102 / 16      (389378是10进制,这里的16是10进制,5F102是16进制)
389378 % 16 == 5F102 % 16   (389378是10进制,这里的16是10进制,5F102是16进制)

上面10进制转16为什么要循环右推,而不是直接取值,当然也可以直接取值


(0x5F102 / (16**4)) % 16 = 5
(0x5F102 / (16**3)) % 16 = F
(0x5F102 / (16**2)) % 16 = 1
(0x5F102 / (16**1)) % 16 = 0
(0x5F102) % 16 = 2     这里不建议写 (0x5F102 / (16**0)) % 16,因为这里移动0位,虽然16的0次方是1,0x5F102 / 1结果也是0x5F102,但是这种不严谨的思维,会导致你下次写16转10进制的时候出错


  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
十六进制数文本型 
十六进制数 = “FF2FFFDF”
调试输出 (十六进制到十进制 (十六进制数))
调试输出 (十进制到十六进制 (十六进制到十进制 (十六进制数)) = 十六进制数)
子程序名返回值类型公开备 注
十六进制到十进制长整数型 
参数名类 型参考可空数组备 注
待转换进制文本型
变量名类 型静态数组备 注
i整数型 
移动位数整数型 
当前字符文本型 
进制表文本型 
进制表值整数型 
进制数整数型 
结果长整数型 
进制表 = “0123456789ABCDEF”
进制数 = 16
结果 = 0
计次循环首 (取文本长度 (待转换进制), i)
移动位数 = 取文本长度 (待转换进制) - i
当前字符 = 取文本中间 (待转换进制, i, 1)
进制表值 = 到整数 (寻找文本 (进制表, 当前字符, , ) - 1)
如果真 (进制表值 < 0)
调试输出 (“错误字符:” + 当前字符)
结果 = 0
跳出循环 ()
结果 = 结果 + 进制表值 × 求次方 (进制数, 移动位数)
计次循环尾 ()
返回 (结果)
子程序名返回值类型公开备 注
十进制到十六进制文本型 
参数名类 型参考可空数组备 注
待转换进制整数型
变量名类 型静态数组备 注
i整数型 
移动位数整数型 
当前字符文本型 
进制表文本型 
进制表值整数型 
进制数整数型 
结果文本型 
待转换进制_无符号数长整数型 
字符位置整数型 
判断 (待转换进制 < 0)
待转换进制_无符号数 = 到长整数 (到长整数 (4294967295) + 待转换进制 + 1)
待转换进制_无符号数 = 到长整数 (待转换进制)

进制表 = “0123456789ABCDEF”
进制数 = 16
结果 = “”
判断循环首 ()
字符位置 = 到整数 (待转换进制_无符号数 % 进制数) + 1
如果真 (字符位置 < 1 字符位置 > 取文本长度 (进制表))
调试输出 (“错误字符位置:”到文本 (字符位置))
结果 = “”
跳出循环 ()
结果 = 取文本中间 (进制表, 字符位置, 1) + 结果
待转换进制_无符号数 = 待转换进制_无符号数 ÷ 16
如果真 (待转换进制_无符号数 = 0)
跳出循环 ()

判断循环尾 ()
返回 (结果)


i支持库列表   支持库注释   
spec特殊功能支持库

评分

参与人数 1好评 +1 精币 +2 收起 理由
猪滴寳貝哝 + 1 + 2 支持开源~!感谢分享

查看全部评分

本帖被以下淘专辑推荐:

结帖率:90% (160/178)

签到天数: 7 天

发表于 2023-10-4 23:45:10 | 显示全部楼层   广东省佛山市

突然感觉有点道理
回复 支持 反对

使用道具 举报

结帖率:100% (47/47)

签到天数: 30 天

发表于 2023-10-4 23:24:37 | 显示全部楼层   江西省赣州市
@小白弟弟 格局小了
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)
发表于 2023-3-24 03:59:54 | 显示全部楼层   香港特别行政区*
任意进制转十进制可以用权值方法。
十进制转任意进制用短除法。
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 28 天

发表于 2023-3-21 16:24:12 | 显示全部楼层   广西壮族自治区桂林市
回复 支持 反对

使用道具 举报

结帖率:100% (58/58)

签到天数: 28 天

发表于 2023-3-20 23:10:14 | 显示全部楼层   广西壮族自治区玉林市
数学好就是好啊
回复 支持 反对

使用道具 举报

结帖率:100% (47/47)

签到天数: 30 天

发表于 2023-3-20 22:58:50 | 显示全部楼层   江西省南昌市
印象中这叫辗转相除法,高中数学有讲过,大学计算机基础、数字电路基础也会讲以及任意进制转10的计算公式

点评

那不是求最大公约数的吗   广东省佛山市  发表于 2023-10-4 15:50
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表