[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
有更好的算法:
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=123,435,4,43,325,54,234,65,632,45,4342,4265,44,5464
  3. for %%a in (%str%) do (
  4. set /a "n+=^!((%%~a-n)>>31)*(%%~a-n)"
  5. )
  6. echo 最大值:!n!
  7. for %%a in (%str%) do (
  8. set /a "n-=^!((n-%%~a)>>31)*(n-%%~a)"
  9. )
  10. echo 最小值:!n!
  11. pause
复制代码
1

评分人数

    • abcdshenji: 琢磨了半小时终于明白了技术 + 1

TOP

换一种更通俗的:
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=123,435,4,43,325,54,234,65,632,45,4342,4265,44,5464
  3. set max=0
  4. for %%a in (%str%) do (
  5.    if %%~a gtr !max! set max=%%~a
  6. )
  7. echo 最大值:!max!
  8. set min=!max!
  9. for %%a in (%str%) do (
  10.    if %%~a lss !min! set min=%%~a
  11. )
  12. echo 最小值:!min!
  13. pause
复制代码

TOP

5# wankoilz


和4楼代码是同一个思路,计算量接近,效率应该差不多,“^!((%%~a-n)>>31)”是判断%%~a(加~是为了严谨)是否小于n,小于则结果为0,否则为1,总之就是模拟判断两数大小的布尔运算,其他的应该很好理解了吧

TOP

11# wankoilz

>>是位移,因为bat中正负数的存储方式有别,导致自然数位移超过其二进制形态的位数之后结果为0,而负数则为-1
!是布尔运算,若a为0,则!a为1,若a为1,则!a为0,也可以不要布尔运算,"n-=(1+(%%~a-n)>>31)*(%%~a-n)"意思是一样的,不过!的意图比较明了,易读性更强,至于^虽然本身也是运算符,但是由于此处开启了变量延迟,所以在计算之前还要经过一次预处理,!必须写为^!,而^必须写为^^,另外,若开启变量延迟的代码中要使用!,不光要用^转义,还要用上""

TOP

set排序不需要教程...

TOP

返回列表