批处理把十进制转换成二,八,十六进制
转自: [url]http://www.52sky.org/article/Computer%20Program/44.html[/url][code]@echo off:start210
cls
echo 十进制转换
echo.
:start20
set a=&set b=&set c=&set d=&set e=&set f=
set /p a=请输入^<十进制^>:
set e=%a%&set f=%a%
if "%a%"=="" cls&goto start210
if %a%==dd cls&goto start210
if %a%==q exit
:30
set /a b=%a%%%2
set /a c=%a%/2
set d=%b%%d%
if %c% geq 2 set a=%c%&goto 30
if %c% equ 0 set c=
echo 对应 [二进制]: %c%%d%
set b=&set c=&set d=
:10
set /a b=%e%%%8
set /a c=%e%/8
set d=%b%%d%
if %c% geq 8 set e=%c%&goto 10
if %c% equ 0 set c=
echo 对应 [八进制]: %c%%d%
set a=&set b=&set c=&set d=
:20
set /a b=%f%%%16
if %b%==10 set b=A
if %b%==11 set b=B
if %b%==12 set b=C
if %b%==13 set b=D
if %b%==14 set b=E
if %b%==15 set b=F
set /a c=%f%/16
set d=%b%%d%
if %c% geq 16 set f=%c%&goto 20
if %c%==10 set c=A
if %c%==11 set c=B
if %c%==12 set c=C
if %c%==13 set c=D
if %c%==14 set c=E
if %c%==15 set c=F
if %c%==0 set c=
echo 对应 [16进制]: %c%%d%&echo/
goto start20[/code] 很厉害呀,能帮忙解释一下大概思路....?!谢谢 十进制与2、8、16 进制转换方法
模上2取余,除以二取整,实际就是 除以二取余数,当正好除尽时(这里不包括小数),将余数由低位到高位排列 即相应十进制的二进制表,其他进制同理 代码太长了,,, [b] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=83339&ptid=11791]4#[/url] [i]▄︻┻═┳一[/i] [/b]
你给个短的呗 [b] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=83362&ptid=11791]5#[/url] [i]Batcher[/i] [/b]
貌似随风写过32进制以内的通用版 不考虑速度的话,用递归,代码应该很简短
zm感兴趣否? 对输入数长度判断在16位以内 如需处理更大数 可自加判断
当然 有人可处理转其他进制[code]
@echo off&setlocal enabledelayedexpansion
set/p Str=请输入十进制数:
set "Code=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_@"
for %%i in (2 8 16) do set S=!str!&call:lp %%i _%%i&ECHO !str! 对应 [%%i进制]: !_%%i!
pause&exit
:lp
set U=!S!FEDCBA9876543210
SET/A U=0x!U:~16,1!,R=0
for /l %%i in (0 1 %U%) do (
set/a "N=!S:~%%i,1!+(R*10),r=N%%%1,N/=%1"
set B=!B!!N!
if !B! equ 0 set "B="
)
set %2=!Code:~%R%,1!!%2!
if defined B set S=!B!&set B=&goto lp
[/code] [b] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=83397&ptid=11791]7#[/url] [i]plp626[/i] [/b]
不太明白,个人感觉常规方法就很简洁了啊 感觉2,8,16这些特殊进制(2的正整数次方幂)可以用位运算直接些 [i=s] 本帖最后由 523066680 于 2011-6-20 21:35 编辑 [/i]
虽然不见得好,做了就贴上来了,0123456789abcde 字符截取,这一块是抄学的。[code]
@echo off
setlocal enabledelayedexpansion
set str=0123456789abcdef
call :lp 10 2
echo %num%
call :lp 10 8
echo %num%
call :lp 10 16
echo %num%
pause
:lp
set "num="
:in
set /a x=%1/%2,y=%1 %% %2
set num=!str:~%y%,1!%num%
if %x% neq 0 (call :in %x% %2) else (goto :eof)
[/code] [b] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=83468&ptid=11791]10#[/url] [i]neorobin[/i] [/b]
老兄好久不见...
不过我感觉位此处用运算并没有优势啊 [b] [url=http://www.bathome.net/redirect.php?goto=findpost&pid=83473&ptid=11791]12#[/url] [i]zm900612[/i] [/b]
仅适用于 正数 并且要求 算术右移实现, 想到这个就写出来了, 也可把每位都存入(开头的 0 不存入)变量, if !code!==0 set "code="[code]@echo off & setlocal enableDelayedExpansion
REM 2147483647=~(1<<31)
set HEX_TAB=0123456789ABCDEF
for /l %%a in () do (
set /p num="Input a decimal number: "
set /a "test=1<<31
<nul set /p="Binary: "
for /l %%i in (31 -1 0) do (
set /a "bit=num&test,test>>=1,test&=~(1<<31),bit>>=%%i,bit&=~(1<<31)"
<nul set /p=!bit!
)
echo.
<nul set /p="Hex.: "
set /a "test=0xf<<4*(32/4-1)
for /l %%i in (28 -4 0) do (
set /a "bit=num&test,test>>=4,test&=(1<<28)-1,bit>>=%%i,bit&=(1<<28)-1"
for %%p in (!bit!) do <nul set /p=!HEX_TAB:~%%p,1!
)
echo.
<nul set /p="Octal: "
set /a "test=07<<3*(32/3)" & rem 32=3*10+2
for /l %%i in (30 -3 0) do ( rem Arithmetic Shift Right >>
set /a "bit=num&test,test>>=3,test&=(1<<30)-1,bit>>=%%i,bit&=(1<<30)-1"
<nul set /p=!bit!
)
echo.&echo.
)
exit /b
[/code] 还是只用于正数, 位运算实现, 只显示有效数字[code]@echo off & setlocal enableDelayedExpansion
REM 2147483647=~(1<<31)
set HEX_TAB=0123456789ABCDEF
for /l %%a in () do (
set /p num="Input a decimal number: "
<nul set /p="Binary: "
set code=
set /a "test=1<<31
for /l %%i in (31 -1 0) do (
set /a "bit=num&test,test>>=1,test&=~(1<<31),bit>>=%%i,bit&=~(1<<31)"
set "code=!code!!bit!"
if !code!==0 set code=
)
echo !code!
<nul set /p="Hex.: "
set code=
set /a "test=0xf<<4*(32/4-1)
for /l %%i in (28 -4 0) do (
set /a "bit=num&test,test>>=4,test&=(1<<28)-1,bit>>=%%i,bit&=(1<<28)-1"
for %%p in (!bit!) do set "code=!code!!HEX_TAB:~%%p,1!"
if !code!==0 set code=
)
echo !code!
<nul set /p="Octal: "
set code=
set /a "test=07<<3*(32/3)" & rem 32=3*10+2
for /l %%i in (30 -3 0) do ( rem Arithmetic Shift Right >>
set /a "bit=num&test,test>>=3,test&=(1<<30)-1,bit>>=%%i,bit&=(1<<30)-1"
set "code=!code!!bit!"
if !code!==0 set code=
)
echo !code! & echo.
)
exit /b
[/code] 输入数在可运算范围内的位移
如超出运算范围 8楼代码可处理大数[code]
@echo off&setlocal enabledelayedexpansion
set/p T=输入10进制数:
set "Code=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_@"
for %%i in (1 3 4) do (
set /a "i=1<<%%i,j=i-1"
set S=%T%
for /l %%j in (0 1 31) do (
if !S! neq 0 (
set/a "B=S&j,S>>=%%i"
for %%k in (!B!) do set _%%i=!Code:~%%k,1!!_%%i!
)
)
echo %T% 对应 !i! 进制 "!_%%i!"
)
pause
[/code] 膜拜一下!
实在有些高深! 恩 不错!学习了~~! 正巧用上~ [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=83423&ptid=11791]8#[/url] [i]terse[/i] [/b]
能否写个转负数的
页:
[1]