[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 wankoilz 于 2014-8-5 02:00 编辑

无聊翻看经典帖子,发现前两段代码好像都少算了一个字符,比如第二段代码,在执行到
  1. set $=!$!fedcba9876543210&set/aN+=0x!$:~16,1!
复制代码
的时候,变量$的长度范围应该是1-16(不考虑$长度为0),而fedcba9876543210只能表达0-15
所以似乎应该把这一句改成这样:
  1. set $=!$!!$!100f0e0d0c0b0a090807060504030201&set/aN+=0x!$:~32,2!
复制代码
小小疏忽,请明察

TOP

本帖最后由 wankoilz 于 2014-8-5 12:38 编辑

哦哦对的,是我自己没仔细看,在原字符串后加上一位就对了。
楼主的代码确实是简练!
不过对于我来说,不改动原字符串更容易理解 :
  1. :strlen <stringVarName> [retvar]
  2. :: 思路: 二分回溯联合查表法
  3. :: 说明: 所求字符串大小范围 0K ~ 8K;
  4. ::    stringVarName ---- 存放字符串的变量名
  5. ::    retvar      ---- 接收字符长度的变量名
  6. setlocal enabledelayedexpansion
  7. set "$=!%1!"
  8. set N=&for %%a in (4096 2048 1024 512 256 128 64 32 16)do if !$:~%%a!. NEQ . set/aN+=%%a&set $=!$:~%%a!
  9. set $=!$!!$!100f0e0d0c0b0a090807060504030201
  10. set/aN+=0x!$:~32,2!&set/aN+=0x!$:~16,1!
  11. endlocal&If %2. neq . (set/a%2=%N%)else echo %N%
复制代码

TOP

标题

本帖最后由 wankoilz 于 2014-8-5 21:01 编辑

这样的话,fedcba9876543210中的0都可以省了。
不过我还是觉得用4096  2048……更好,因为每个数字正好对应于二进制上的一位,理解和计算都更好一点。
1

评分人数

    • CrLf: 感谢指点~技术 + 1

TOP

对的,不好意思,手机太老了

TOP

返回列表