找回密码
 点一下
查看: 2794|回复: 9

请教大神,任意进制转10进制(32以内)

[复制链接]
发表于 2012-7-15 18:10:07 | 显示全部楼层 |阅读模式
http://bbs.islga.org/read-htm-tid-628.html
在这个帖子的 5 楼有代码,经测试,只有10进制转任意进制(32以内)有效.
但任意进制转10进制(32以内)却缺少一个函数声明,求大神帮忙解决问题.
发表于 2012-7-15 19:12:46 | 显示全部楼层
知道进制转换的公式么
回复

使用道具 举报

 楼主| 发表于 2012-7-15 23:10:50 | 显示全部楼层
知道一点,但写公式写不出来
回复

使用道具 举报

发表于 2012-7-15 23:35:28 | 显示全部楼层
just449540179:知道一点,但写公式写不出来 (2012-07-15 23:10)
比如10进制转2进制,那么就把10进制那个数一直除2,所得的余数就是2进制的

10进制:38
38/2 = 19……0
19/2 = 9……1
9/2 = 4……1
4/2 = 2……0
2/2 = 1……0
1/2 = 0……1
余数从下往上,100110就是38的2进制形式,其它进制类同


于是该2进制转回10进制就是,
1*2^5 + 0*2^4 + 0*2^3 + 1*2^2 + 1*2^1 + 0*2^0 = 38
1            0            0             1             1           0

相当于
10011010 = 10011……0
10011/10 = 1001……1
1001/10 = 100……1
……
1/10 = 0……1
从上到下用余数依次乘以2^x,x从0开始每次+1

于是只要用个循环做上述操作即可~
即取余数,乘以2^x,加到之前累积的数字里,重新循环,直到被除数为0


当然10以上的进制用到了字母,需要另外处理下~
比如字母转成数字,a=10,b=11这样……
回复

使用道具 举报

发表于 2012-7-16 09:21:44 | 显示全部楼层
先上一个把十进制数转成任意进制数,这是算法支持十以上进制
[jass]

globals
constant string Weights = "0123456789ABCDEFGHIJKLMNOPQRSTUV"
//Supports only 32 hex
endglobals
function GetHexString takes integer index returns string
     return SubString(Weights, index-1, index)
endfunction
function GetStringWeights takes string num returns integer
      local integer i = 1
      loop
           exitwhen i > 32
           if SubString(Weights, i - 1, i ) == num then
                 return i
          endif
          set i = i + 1
    endloop
endfunction
function A2Ds takes integer number,integer hex returns string
    local string O = null
    local integer  temp
    if number < 0 then
        set number = 0 - number
        set O = "-"
    endif
    loop
        exitwhen number == 0
        set temp = number - ( number / hex ) * hex
        set O = O + GetHexString(temp)
        set  number = number / hex
    endloop
    return O
endfunction
function A2D takes integer number,integer hex returns integer
     return S2I(A2Ds(number,hex))
endfunction
//超过十进制不要使用A2D函数
把任意进制转成十进制
//不支持带符号的进制数
function sD2A takes string number ,integer hex returns integer
      local integer Len = StringLength(number)
      local integer dnumber = 0
      local integer index = 1
     loop
         exitwhen index > Len
         set dnumber = dnumber + GetStringWeights(SubString(number,index-1,index)) * Pow(hex,Len - index)
         set index = index + 1
    endloop
    return dnumber
endfunction
function D2A takes integer number ,integer hex returns integer
     return sD2A(I2S(number),hex)
endfunction[/jass]
回复

使用道具 举报

 楼主| 发表于 2012-7-16 11:15:15 | 显示全部楼层
不需要字母预先先换成数字然后进行函数运算?
回复

使用道具 举报

发表于 2012-7-16 12:02:57 | 显示全部楼层
just449540179:不需要字母预先先换成数字然后进行函数运算? (2012-07-16 11:15)
4楼说了不支持10进制以上的运算…………
回复

使用道具 举报

发表于 2012-7-16 12:14:00 | 显示全部楼层

回 just449540179 的帖子

just449540179:不需要字母预先先换成数字然后进行函数运算? (2012-07-16 11:15)
不需要!没看懂吗?亲?
回复

使用道具 举报

发表于 2012-7-16 15:29:35 | 显示全部楼层
说白了就是获取每个权位的字符代表的数值m,如16进制中的A代表10
然后获取这个字符所在的位置n,最后一个参数是进制值j,如16进制就是16

这样,对于一个j进制数,它的每一位的值就是m*j^(n-1)  

将所有位的值加起来就是十进制的值了。

这里有两个关键点,一个是获取每个字符对应的十进制值
另外就是获取字符所在位置,

位置可以用循环逐个获取
而对应的值有很多种方法

因为进制转换系统都是相互转换的,所以你注册字符对应十进制值的同时进行反向注册

方法是用字符的hashstring函数(这是1.24的方法)获取后直接用做key存储对应的十进制值到一个hashtable

如果非1.24或者看不懂
可以采用最笨的遍历所有字符,匹配出十进制值
回复

使用道具 举报

发表于 2012-7-17 09:50:13 | 显示全部楼层

回 疯人¢衰人 的帖子

疯人¢衰人:说白了就是获取每个权位的字符代表的数值m,如16进制中的A代表10
然后获取这个字符所在的位置n,最后一个参数是进制值j,如16进制就是16

这样,对于一个j进制数,它的每一位的值就是m*j^(n-1)  

....... (2012-07-16 15:29)
[jass]
constant string Weights = "0123456789ABCDEFGHIJKLMNOPQRSTUV"
[/jass]
请问一下这种写法,是叫什么了...
请问这里到底要不要区分大小写,没有去测试...
纠结。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-2 17:29 , Processed in 0.111293 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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