Board logo

标题: [数值计算] 批处理如何将10进制转换成16进制? [打印本页]

作者: 希望的寄托    时间: 2008-3-4 13:31     标题: 批处理如何将10进制转换成16进制?

那天的发错了,写成了将十进制转换成12进制,我知道方法是一样的,但是要用批处理来写,我还不会
那天的那个贴子上管理员回复叫我问namejm
如果namejm看到了我的贴子请帮我解答一下,谢谢了!
作者: foxJL    时间: 2008-3-4 15:14

算法:
  1. 比如11271900转换成16进制是:ABFEDC
  2. 先拿16除11271900,商704493,余12
  3. 再拿16除704493,商44030,余13
  4. 再拿16除44030,商2751,余14
  5. 再拿16除2751,商171,余15
  6. 再拿16除171,商10,余11
  7. 再拿16除10,商0,余10
  8. 最后,倒着取这些:
  9. 10
  10. 11
  11. 15
  12. 14
  13. 13
  14. 12
  15. 然后按照这个表换算:
  16. 10=A
  17. 11=B
  18. 12=C
  19. 13=D
  20. 14=E
  21. 15=F
  22. 连起来就是:ABFEDC
复制代码


代码:
  1. @echo off
  2. set f=0123456789ABCDEF
  3. set /p num=输入十进制数字:
  4. :a
  5. set /a mod = %num% %% 16
  6. set /a num /=16
  7. set en=%mod% %en%
  8. if not %num% lss 1 (goto a)
  9. for %%i in (%en%) do (call set/p=%%f:~%%i,1%%<nul)
  10. pause>nul
复制代码

[ 本帖最后由 foxJL 于 2008-3-4 15:27 编辑 ]
作者: 随风    时间: 2008-3-4 15:20

:
  1. @echo off&set str=9
  2. set max=10997
  3. set var=%max%
  4. for %%a in (A B C D E F) do (
  5.   set /a str+=1
  6.   call set _%%str%%=%%a
  7. )
  8. :lis
  9. set /a a=var%%16,var=var/16
  10. if defined _%a% call set a=%%_%a%%%
  11. set num=%a%%num%
  12. if %var% gtr 0 goto lis
  13. echo\&echo 十进制数 %max% 转换为十六进制数为:%num%
  14. echo\&pause
复制代码

作者: 随风    时间: 2008-3-4 15:22

foxjl 抢先了,
比我的好
作者: 希望的寄托    时间: 2008-3-4 16:26

谢谢了,取余数的那些我都忘记了,我把这复制下来,晚上好好看看,呵呵
谢谢各位了
作者: 随风    时间: 2008-3-4 17:51

十六进制转换十进制
  1. @echo off
  2. (set /a str=9,n=1,num=0)
  3. set var=2AF5
  4. echo %var%
  5. for %%a in (0 1 2 3 4 5 6 7 8 9 A B C D E F) DO (
  6.    call set var=%%var:%%a=%%a %%
  7. )
  8. for %%a in (%var%) do call set max=%%a %%max%%
  9. for %%a in (A B C D E F) do (
  10.   set /a str+=1
  11.   call set %%a=%%str%%
  12. )
  13. for %%a in (%max%) do (
  14.   set /a num=%%a*n+num
  15.   set /a n*=16
  16. )
  17. echo %num%
  18. pause>nul
复制代码

作者: 希望的寄托    时间: 2008-3-5 14:53

set /a num /=16  这一句是干什么用的。我怎么看来看去都觉得这里好像读不通一样
这个num后面的/是除的意思还是什么意思啊,要是除的意思那后面的=又是什么意思啦
作者: 随风    时间: 2008-3-5 15:01

set /a num/=16
是简写
set /a num=%num%/16
作者: 希望的寄托    时间: 2008-3-5 15:23

谢了,这个/是当前面的num用是吧,总算是明白了,谢了喔
作者: 希望的寄托    时间: 2008-3-6 10:54

call set/p=%%f:~%%i,1%%<nul
这一段中的=%%f:~%%i,1%%是将这一个变量中取F变量中的前%%i去掉,选取后一位,这个%%i就是一个变量,里面不止一个数,也就是不管%%i里面有多少位都会从中不断取出,并且每个都是去掉他所属的数(如A F)并且选项去掉之后的后一位,这样是否为正解,也许解答得不容易懂
作者: foxJL    时间: 2008-3-6 12:43

原帖由 希望的寄托 于 2008-3-6 10:54 发表
call set/p=%%f:~%%i,1%%

对,取变量%f%中%%i的下一位.
作者: 希望的寄托    时间: 2008-3-6 15:17

谢谢,今天上午我一直没有看明白,后来搞一个简单的数字在纸上写着看,一一对应,最后才理解过来的,呵呵呵,谢谢版主啊
作者: foxJL    时间: 2008-3-6 16:56

干脆再加一点,凑成十进制转任意进制.
  1. @echo off
  2. ::code by foxjl bbs.bathome.net
  3. title 十进制转任意进制
  4. mode con cols=40 lines=20
  5. set f=0123456789ABCDEF
  6. for %%i in (2.十进制转二进制,8.十进制转八进制,12.十进制转十二进制,16.十进制转十六进制) do (
  7.         echo.&echo.&echo.&set /p=           %%i<nul)
  8.         echo.&echo.&        set /p n=           选择:
  9. cls
  10. title 十进制转%n%进制
  11. set /p num=输入十进制数字:
  12. :a
  13. set /a mod=num%%n,num /=n
  14. set en=%mod% %en%
  15. if not %num% lss 1 (goto a)
  16. for %%i in (%en%) do (call set/p=%%f:~%%i,1%%<nul)
  17. pause>nul
复制代码

[ 本帖最后由 foxJL 于 2008-3-6 17:59 编辑 ]
作者: 随风    时间: 2008-3-6 17:54

set f=0123456789ABC
呵呵呵,少写了些字母吧?
作者: foxJL    时间: 2008-3-6 18:00

原帖由 随风 于 2008-3-6 17:54 发表
set f=0123456789ABC
呵呵呵,少写了些字母吧?
呵呵,多谢指正,代码已经更新.
作者: 希望的寄托    时间: 2008-3-6 22:20

真是太牛了,小弟领教了




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2