2017-09-16 1 views
1

この10進数を16進数と2進数のコンバーターに変換しています。16進数は10進数を16進数に変換し、バイナリ変換はそれを行います。10進数から16進数およびバイナリコンバータへバッチプログラム、どのように違う方法で実装するのですか?

これはうまくいきますが、このコードを実装する別の方法はありますか?

@echo off 
setlocal EnableDelayedExpansion 

:Main 
setlocal 
cls 
set /p decIn=enter Decimal value: 
call :DectoHex %decIn% hexOut 
call :DectoBin %decIn% binOut 
echo !hexOut! 
echo !binOut! 
pause>nul 
goto :main 
endlocal 

::------------------------------------------------------------------------------------- 

:DectoHex 
set /a A=%1 
set map=ABCDEF 
set H= 

:Hexloop 
set /a B=!A! %%16 & set /a A /=16 
set H=!map:~%B%,1!!H! 
if !A! gtr 0 goto :Hexloop 
set %2=!H! 
goto :eof 

::------------------------------------------------------------------------------- 

:DectoBin 
:: Note Dec Bit Bin (DBB) 

set /a Dec=%1 
set Bin= 
for /L %%i in (1,1,32) do (
    set /a "Bit=Dec&1, Dec>>=1" 
    set Bin=!Bit!!Bin! 
) 


:skimming 
    if %Bin:~0,1% == 0 (
    set Bin=%Bin:~1% & goto :skimming 

) 

set %2=!Bin! 
goto :eof 

::----------------------------------------------------------------------------- 

:BintoDec 
set bin=11011 
set dig= 
set digval=1 

set dec= 

:Loop 
if %bin% gtr 1 (
    set dig=%bin:~-1% 
    set bin=%bin:~0,-1% 
) else (
    set /a dig=%bin% 
    set bin=0 
) 

if %dig% equ 1 (
    set /a dec+=%digval% 
) 
set digval *=2 

if %bin% gtr 0 goto :loop 

echo %dec% 

pause>nul 

goto :eof 

主な機能は、2と36の間の任意の数の基地へ/から変換するには、ユーザからの入力をrecieves 16進数変換器のパラメータとバイナリコンバータとして変数を渡し、

+0

ので、あなたは可能性変換する基数を渡して、サブルーチンを1つだけ持ちます。 – LotPings

+2

この質問は、[コードレビュースタックエクスチェンジ](https://codereview.stackexchange.com/)よりも、スタックオーバーフローより適しています。これは、ユーザーが実際に十進数(または16進数「0x」で始まる数字または「0」で始まる8進数)。 – Mofi

答えて

2

:: Q:\Test\2017\09\16\SO_46254352.cmd 
@echo off & setlocal EnableDelayedExpansion 
set map=ABCDEFGHIJKLMNOPQRSTUVWXYZ 

:Main 
cls 
set "DecIn=" 
set /p DecIn=enter value: 
if not defined DecIn goto :Eof 
Set /A DecIn=DecIn 

call :Dec2Base 2 %DecIn% BaseOut 
call :Base2Dec 2 %BaseOut% DecBack 
echo DecBack=%DecBack% Base 2=%BaseOut% 

call :Dec2Base 16 %DecIn% BaseOut 
call :Base2Dec 16 %BaseOut% DecBack 
echo DecBack=%DecBack% Base 16=%BaseOut% 

call :Dec2Base 32 %DecIn% BaseOut 
call :Base2Dec 32 %BaseOut% DecBack 
echo DecBack=%DecBack% Base 32=%BaseOut% 

goto :main 
::------------------------------------------------------------------------------------- 
:Dec2Base Base DecIn BaseOut 
Setlocal 
Echo:%2|findstr /i "^[%map:~0,10%]*$" >Nul 2>&1 ||(Echo invalid char for base 10&Goto :Eof) 
set /a Num=%2 
set "Ret=" 

:Dec2BaseLoop 
set /a "Digit=Num %% %1" 
set /a "Num /= %1" 
set Ret=!map:~%Digit%,1!%Ret% 
if "%Num%" neq "0" goto :Dec2BaseLoop 
Endlocal&Set "%3=%Ret%"&Goto :Eof 
::------------------------------------------------------------------------------------- 

:Base2Dec Base BaseIn DecBack 
Setlocal EnableDelayedExpansion 
Set /A "Base=%1,PlaceVal=1,Ret=0" 
Echo:%2|findstr /i "^[!map:,%Base%!]*$" >Nul 2>&1 ||(Echo invalid char for base %1&Goto :Eof) 
Set Val=%2 

:Base2DecLoop 
Set "Digit=%Val:~-1%" 
If %Digit% Leq 9 goto :Next 
For /L %%i in (10,1,%Base%) Do If /i "!Digit!" Equ "!map:~%%i,1!" (Set "Digit=%%i" & Goto :Next) 
Echo Something went wrong & Pause 

:Next 
set /A "Ret+=Digit * PlaceVal,PlaceVal *= Base" 
Set "Val=%Val:~0,-1%" 
If defined Val goto :Base2DecLoop 
Endlocal & Set "%3=%Ret%" & Goto :Eof 

出力例:algorythmは同じまま

> Q:\Test\2017\09\16\SO_46254352.cmd 
enter value: 4095 
DecBack=4095 Base 2=111111111111 
DecBack=4095 Base 16=FFF 
DecBack=4095 Base 32=3VV 
enter value: 0xBadAffe 
DecBack=195932158 Base 2=1011101011011010111111111110 
DecBack=195932158 Base 16=BADAFFE 
DecBack=195932158 Base 32=5QRBVU 
+0

次の行の意味を教えてください。エコー:%2 | findstr/i "^ [%map:〜0,10%] * $"> Nul 2>&1 ||(ベース10&Gotoのエコー無効な文字:Eof) – LogomonicLearning

+0

後で 'set/Decin = Decin(16進入力を許可する)はそれ以上の意味を持ちません。これは、無効な文字を削除します(varsと解釈されます)。その目的は、完全な入力が数値ベースに一致する桁の範囲内にあるかどうかをチェックすることでした。 – LotPings

関連する問題