回复 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
- pause
复制代码
|