回复 1# plp626
楼主的算法确实精简高效,把数学计算用到了极致。但这两天在学习时发现,该代码存在以下问题:
1、使用for /l (128 64 32...)时,判断某数为空后折半,需要把括号中的数减一后再判断,就如
if "!a:~127,1!" neq "" set /a "len+=%%a",而不是if "!a:~%%a,1!" neq "" set /a "len+=%%a"。用这种算法,固然可以在全部计算后最终加1得到正确长度,但是毕竟原代码结果不正确。
2、第9句的set/a "len+=0x!s:~16,1!",应该是set/a "len+=0x!s:~15,1!"
说的不对的地方,请斧正。
我的代码如下: | @echo off | | set "var=1234567890abcdefghijklmnopqrstuv12345678901234567890abcdefghijklmnopqrstuv12345678901234567890abcdefghijklmnopqrstuv12345678901" | | call :Len var,n | | echo 长度为%n% | | pause&exit | | | | :Len | | Setlocal enabledelayedexpansion | | set "s=!%1!" | | for %%a in (512 256 128 64 32 16) do ( | | set/a "m1=%%a-1" &call set "b1=%%s:~!m1!,1%%" | | if "!b1!" neq "" ( | | set/a "len+=%%a" &set "s=!s:~%%a!" | | if "!s!"=="" goto ok ) | | ) | | | | set "s=!s!fedcba9876543210" &set/a "len+=0x!s:~15,1!" | | :ok | | endlocal&set/a "%2=%len%"&goto:eof | | pauseCOPY |
|