|
|
发表于 2025-12-3 19:33:46
|
显示全部楼层
本帖最后由 RENaa_FD 于 2025-12-4 19:12 编辑
本来向着自己在cmd实现原生的2-36进制转换,向着试试问问ai,但没想到ai出乎我意料的给出了完整的正确实现
顺便补充:这个实现与我之前给的10转16的行为差异是其对负数的处理是直接添加负号,而不是补码表示,至于哪个更好就得看使用场景了,有效的数字范围都是一样的- @echo off
- setlocal EnableDelayedExpansion
- :: ============================================================================
- :: 测试用例
- :: ============================================================================
- echo --- 十进制转任意进制测试 (2-36) ---
- echo.
- call :testOutput "10转2进制: " 10 2
- call :testOutput "255转16进制: " 255 16
- call :testOutput "255转8进制: " 255 8
- call :testOutput "1024转16进制: " 1024 16
- call :testOutput "1000转36进制: " 1000 36
- call :testOutput "35转36进制: " 35 36
- echo.
- echo --- 负数测试 ---
- call :testOutput "-10转2进制: " -10 2
- call :testOutput "-255转16进制: " -255 16
- call :testOutput "-1000转8进制: " -1000 8
- call :testOutput "-35转36进制: " -35 36
- echo.
- echo 按任意键退出...
- pause >nul
- :: 跳转到文件末尾
- goto :eof
- :: ============================================================================
- :: 子程序:测试输出
- :: 用法: call :testOutput "标签文本" 数值 进制
- :: ============================================================================
- :testOutput
- set "LABEL=%~1"
- call :decToAny %~2 %~3
- echo %LABEL%!RESULT!
- goto :eof
- :: ============================================================================
- :: 子程序:十进制转任意进制 (2-36)
- :: 功能: 计算结果存入RESULT变量
- :: 用法: call :decToAny 十进制数 目标进制
- :: ============================================================================
- :decToAny
- set "DEC=%~1"
- set "BASE=%~2"
- set "DIGITS=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- set "RESULT="
- REM 验证输入
- if not defined BASE set "BASE=16"
- set /a "BASETMP=10*BASE" 2>nul || (
- set "RESULT=错误:无效的进制 '%~2'"
- goto :eof
- )
- if %BASE% lss 2 (
- set "RESULT=错误:进制必须≥2"
- goto :eof
- )
- if %BASE% gtr 36 (
- set "RESULT=错误:进制必须≤36"
- goto :eof
- )
- REM 处理零
- if "%DEC%"=="0" (
- set "RESULT=0"
- goto :eof
- )
- REM 处理负数
- set "SIGN="
- if "%DEC:~0,1%"=="-" (
- set "SIGN=-"
- set "DEC=%DEC:~1%"
- )
- REM 核心转换算法
- set "N=%DEC%"
- :loop
- if "%N%"=="0" goto :done
- REM 计算余数和商
- set /a "REM=N %% BASE, N=N / BASE"
- REM 如果余数为负,调整为正数并补偿商
- if !REM! lss 0 (
- set /a "REM=REM + BASE, N=N - 1"
- )
- for %%i in (!REM!) do set "RESULT=!DIGITS:~%%i,1!!RESULT!"
- goto :loop
- :done
- if not defined RESULT set "RESULT=0"
- if defined SIGN set "RESULT=%SIGN%%RESULT%"
- goto :eof
复制代码 |
|