找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 52407|回复: 18

批处理把十进制转换成二,八,十六进制

[复制链接]
发表于 2011-4-7 16:02:06 | 显示全部楼层 |阅读模式
转自: http://www.52sky.org/article/Computer%20Program/44.html
  1. @echo off
  2. :start210
  3. cls
  4. echo      十进制转换
  5. echo.
  6. :start20
  7. set a=&set b=&set c=&set d=&set e=&set f=
  8. set /p a=请输入^<十进制^>:
  9. set e=%a%&set f=%a%
  10. if "%a%"=="" cls&goto start210
  11. if %a%==dd cls&goto start210
  12. if %a%==q exit
  13. :30
  14. set /a b=%a%%%2
  15. set /a c=%a%/2
  16. set d=%b%%d%
  17. if %c% geq 2 set a=%c%&goto 30
  18. if %c% equ 0 set c=
  19. echo  对应 [二进制]: %c%%d%
  20. set b=&set c=&set d=
  21. :10
  22. set /a b=%e%%%8
  23. set /a c=%e%/8
  24. set d=%b%%d%
  25. if %c% geq 8 set e=%c%&goto 10
  26. if %c% equ 0 set c=
  27. echo  对应 [八进制]: %c%%d%
  28. set a=&set b=&set c=&set d=
  29. :20
  30. set /a b=%f%%%16
  31. if %b%==10 set b=A
  32. if %b%==11 set b=B
  33. if %b%==12 set b=C
  34. if %b%==13 set b=D
  35. if %b%==14 set b=E
  36. if %b%==15 set b=F
  37. set /a c=%f%/16
  38. set d=%b%%d%
  39. if %c% geq 16 set f=%c%&goto 20
  40. if %c%==10 set c=A
  41. if %c%==11 set c=B
  42. if %c%==12 set c=C
  43. if %c%==13 set c=D
  44. if %c%==14 set c=E
  45. if %c%==15 set c=F
  46. if %c%==0 set c=
  47. echo  对应 [16进制]: %c%%d%&echo/
  48. goto start20
复制代码

评分

参与人数 1PB +18 收起 理由
lxzzr + 18 感谢分享

查看全部评分

发表于 2011-4-7 17:26:55 | 显示全部楼层
很厉害呀,能帮忙解释一下大概思路....?!谢谢
发表于 2011-5-15 18:41:07 | 显示全部楼层
十进制与2、8、16 进制转换方法
模上2取余,除以二取整,实际就是 除以二取余数,当正好除尽时(这里不包括小数),将余数由低位到高位排列 即相应十进制的二进制表,其他进制同理
发表于 2011-6-19 02:11:38 | 显示全部楼层
代码太长了,,,
发表于 2011-6-19 11:07:28 | 显示全部楼层
4# ▄︻┻═┳一


你给个短的呗
发表于 2011-6-19 14:27:49 | 显示全部楼层
5# Batcher

貌似随风写过32进制以内的通用版
发表于 2011-6-19 18:38:34 | 显示全部楼层
不考虑速度的话,用递归,代码应该很简短

zm感兴趣否?
发表于 2011-6-20 14:58:29 | 显示全部楼层
对输入数长度判断在16位以内 如需处理更大数 可自加判断
当然 有人可处理转其他进制

  1. @echo off&setlocal enabledelayedexpansion
  2. set/p Str=请输入十进制数:
  3. set "Code=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_@"
  4. for %%i in (2 8 16) do set S=!str!&call:lp %%i _%%i&ECHO !str! 对应 [%%i进制]: !_%%i!
  5. pause&exit
  6. :lp
  7. set U=!S!FEDCBA9876543210
  8. SET/A U=0x!U:~16,1!,R=0
  9. for /l %%i in (0 1 %U%) do (
  10.    set/a "N=!S:~%%i,1!+(R*10),r=N%%%1,N/=%1"
  11.    set B=!B!!N!
  12.    if !B! equ 0 set "B="
  13. )
  14.    set %2=!Code:~%R%,1!!%2!
  15.    if defined B set S=!B!&set B=&goto lp
复制代码
发表于 2011-6-20 20:37:12 | 显示全部楼层
7# plp626


不太明白,个人感觉常规方法就很简洁了啊
发表于 2011-6-20 21:16:40 | 显示全部楼层
感觉2,8,16这些特殊进制(2的正整数次方幂)可以用位运算直接些
发表于 2011-6-20 21:33:25 | 显示全部楼层
本帖最后由 523066680 于 2011-6-20 21:35 编辑

虽然不见得好,做了就贴上来了,0123456789abcde 字符截取,这一块是抄学的。

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=0123456789abcdef

  4. call :lp 10 2
  5. echo %num%
  6. call :lp 10 8
  7. echo %num%
  8. call :lp 10 16
  9. echo %num%
  10. pause

  11. :lp
  12. set "num="
  13. :in
  14. set /a x=%1/%2,y=%1 %% %2
  15. set num=!str:~%y%,1!%num%
  16. if %x% neq 0 (call :in %x% %2) else (goto :eof)
复制代码
发表于 2011-6-20 21:38:45 | 显示全部楼层
10# neorobin

老兄好久不见...
不过我感觉位此处用运算并没有优势啊
发表于 2011-6-20 22:33:37 | 显示全部楼层
12# zm900612
仅适用于 正数 并且要求 算术右移实现, 想到这个就写出来了, 也可把每位都存入(开头的 0 不存入)变量, if !code!==0 set "code="
  1. @echo off & setlocal enableDelayedExpansion
  2. REM 2147483647=~(1<<31)
  3. set HEX_TAB=0123456789ABCDEF
  4. for /l %%a in () do (
  5.   set /p num="Input a decimal number: "

  6.   set /a "test=1<<31
  7.   <nul set /p="Binary: "
  8.   for /l %%i in (31 -1 0) do (
  9.     set /a "bit=num&test,test>>=1,test&=~(1<<31),bit>>=%%i,bit&=~(1<<31)"
  10.     <nul set /p=!bit!
  11.   )
  12.   echo.

  13.   <nul set /p="Hex.: "
  14.   set /a "test=0xf<<4*(32/4-1)
  15.   for /l %%i in (28 -4 0) do (
  16.     set /a "bit=num&test,test>>=4,test&=(1<<28)-1,bit>>=%%i,bit&=(1<<28)-1"
  17.     for %%p in (!bit!) do <nul set /p=!HEX_TAB:~%%p,1!
  18.   )
  19.   echo.

  20.   <nul set /p="Octal: "
  21.   set /a "test=07<<3*(32/3)" & rem 32=3*10+2
  22.   for /l %%i in (30 -3 0) do ( rem Arithmetic Shift Right >>
  23.     set /a "bit=num&test,test>>=3,test&=(1<<30)-1,bit>>=%%i,bit&=(1<<30)-1"
  24.     <nul set /p=!bit!
  25.   )
  26.   echo.&echo.
  27. )
  28. exit /b
复制代码
发表于 2011-6-20 23:16:23 | 显示全部楼层
还是只用于正数, 位运算实现, 只显示有效数字
  1. @echo off & setlocal enableDelayedExpansion
  2. REM 2147483647=~(1<<31)
  3. set HEX_TAB=0123456789ABCDEF
  4. for /l %%a in () do (
  5.   set /p num="Input a decimal number: "

  6.   <nul set /p="Binary: "
  7.   set code=
  8.   set /a "test=1<<31
  9.   for /l %%i in (31 -1 0) do (
  10.     set /a "bit=num&test,test>>=1,test&=~(1<<31),bit>>=%%i,bit&=~(1<<31)"
  11.     set "code=!code!!bit!"
  12.     if !code!==0 set code=
  13.   )
  14.   echo !code!

  15.   <nul set /p="Hex.: "
  16.   set code=
  17.   set /a "test=0xf<<4*(32/4-1)
  18.   for /l %%i in (28 -4 0) do (
  19.     set /a "bit=num&test,test>>=4,test&=(1<<28)-1,bit>>=%%i,bit&=(1<<28)-1"
  20.     for %%p in (!bit!) do set "code=!code!!HEX_TAB:~%%p,1!"
  21.     if !code!==0 set code=
  22.   )
  23.   echo !code!

  24.   <nul set /p="Octal: "
  25.   set code=
  26.   set /a "test=07<<3*(32/3)" & rem 32=3*10+2
  27.   for /l %%i in (30 -3 0) do ( rem Arithmetic Shift Right >>
  28.     set /a "bit=num&test,test>>=3,test&=(1<<30)-1,bit>>=%%i,bit&=(1<<30)-1"
  29.     set "code=!code!!bit!"
  30.     if !code!==0 set code=
  31.   )
  32.   echo !code! & echo.
  33. )
  34. exit /b
复制代码
发表于 2011-6-21 14:00:08 | 显示全部楼层
输入数在可运算范围内的位移
如超出运算范围 8楼代码可处理大数

  1. @echo off&setlocal enabledelayedexpansion
  2. set/p T=输入10进制数:
  3. set "Code=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_@"
  4. for %%i in (1 3 4) do (
  5.     set /a "i=1<<%%i,j=i-1"
  6.     set S=%T%
  7.     for /l %%j in (0 1 31) do (
  8.         if !S! neq 0 (
  9.            set/a "B=S&j,S>>=%%i"
  10.            for %%k in (!B!) do set _%%i=!Code:~%%k,1!!_%%i!
  11.         )
  12.     )
  13.     echo %T% 对应 !i! 进制 "!_%%i!"
  14. )
  15. pause
复制代码

评分

参与人数 1PB +6 收起 理由
plp626 + 6 位运算用于2 4 8 16 32进制;

查看全部评分

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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 20:18 , Processed in 0.021230 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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