|
本帖最后由 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 )跳出循环 ()判断循环尾 ()返回 (结果 )
|
评分
-
查看全部评分
|