在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在论坛里看到netbenton的那个不用call调用函数的帖子(下面贴有链接)后,突然记起以前自己写的一个位运算演示的代码(用call来调用函数,现改用netbenton的方法另类的调用),现拿出来和大家分享一下,希望能给初学者一些小小的帮助 @echo off title 位运算示例 code by:cn-bathome-more echo. echo.位运算名词解释(个人理解): echo. echo.位运算: 按操作数在计算机内表示的二进制数逐位进行逻辑运算或移位运算. echo.与: 全部都是1才为1(指返回值,下同),否则为0. echo.或: 只要有1则为1,否则为0. echo.异或: 不同为1,相同为0. echo.取反: 是1则0,是0则1(单目运算符). echo.取负: 先取反再加1(单目运算符). echo.左移n位: 相当于乘以2的n次方(用0补位). echo.右移n位: 相当于除以2的n次方(负数用1补位,正数用0补位). echo. echo.下面的示例是在三十二位系统(数值范围:-2147483648~2147483647)下运行的结果. echo.请输入批处理能处理的数值(整数),否则将不能正确处理.如发生溢出,结果也不会正确. echo. rem 将十进制转换为二进制的函数. set "fun_d2b=setlocal enabledelayedexpansion&(for /l %%a in (0 1 31) do (set /a "str=!#a#!^>^>%%a"&set /a "str^&=1"&set "str_d2b=!str!!str_d2b!"))&(for %%a in (!str_d2b!) do (endlocal&set #a#=%%a))" setlocal enabledelayedexpansion :agn set in=&set /p in=请输入两个数(中间用空格隔开): if not defined in exit set n=0 for %%a in (%in%) do ( set /a n+=1 set /a num!n!=%%a 2>nul ) cls echo.输入的两个数的有效数值为: "!num1!" 和 "!num2!", 用二进制表示分别为: set /a str1=num1,str2=num2 %fun_d2b:#a#=str1% %fun_d2b:#a#=str2% echo.&echo.!str1! ==^> !num1! echo.!str2! ==^> !num2! echo.&echo.各种位运算的结果如下: set /a "num=!num1!&!num2!,t=num" %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位与: !num1! ^& !num2! = !t! set /a "num=!num1!|!num2!,t=num" %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位或: !num1! ^| !num2! = !t! set /a "num=!num1!^^!num2!,t=num" %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位异或: !num1! ^^^^ !num2! = !t! set /a "num=~!num1!,t=num" %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位取反: ~(!num1!) = !t! set /a "num=-!num1!,t=num" %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 取负: -(!num1!) = !t! set /a "ran=%random%%%5+2,num=!num1!,num<<=ran,t=num" %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 左移!ran!位: !num1! ^<^< !ran! = !t! set /a "ran=%random%%%5+2,num=!num1!,num>>=ran,t=num" %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 右移!ran!位: !num1! ^>^> !ran! = !t! echo.&goto :agn 批处理函数的高效另类应用(免call的哦!)高速的真正的批处理函数应用方法! 我想这次应该可以把批处理编程推向一个新的台阶。 @echo off ::定义函数 set "d-h=setlocal enabledelayedexpansion&set/a dx=#a#&set xs=0123456789abcdef&(for /l %%z in (1,1,4) do set /a x%%z=dx%%16,dx=dx/16)&(for /f "tokens=1-4" %%1 in ("!x1! !x2! !x3! !x4!") do set hx=!xs:~%%4,1!!xs:~%%3,1!&(if !hx!==00 set hx=)&(for %%z in ("!hx!!xs:~%%2,1!!xs:~%%1,1!") do endlocal&set #a#=%%~z))" ::10进制转为16进制的函数,参数入口#a# ::要在开启变量延迟之前定义 setlocal enabledelayedexpansion for /l %%a in (1,7,1024) do ( set abc=%%a (%d-h:#a#=abc%) rem 函数调用 echo !abc! ) pause 可以支持多参数了 @echo off ::定义函数 set "d-h=setlocal enabledelayedexpansion&set/a dx=#a#&set xs=0123456789abcdef&(for /l %%z in (1,1,4) do set /a x%%z=dx%%16,dx=dx/16)&(for /f "tokens=1-4" %%1 in ("!x1! !x2! !x3! !x4!") do set hx=!xs:~%%4,1!!xs:~%%3,1!&(if !hx!==00 set hx=)&(for %%z in ("!hx!!xs:~%%2,1!!xs:~%%1,1!") do endlocal&set #a#=%%~z))" ::10进制转为16进制的函数,调用方法:%d-h:#a#=变量名% set "len=for /f "tokens=1-3" %%1 in ("#a#") do setlocal enabledelayedexpansion&(if defined %%2 (set /a z=8180,x=0&(for /l %%a in (1,1,14) do set/a "y=(z-x)/2+x"&(for %%b in (!y!) do if "!%%2:~%%b,1!" equ "" (set/a z=y) else (set/a x=y)))) else (set z=0))&(for %%z in ("!z!") do endlocal&set %%1=%%~z)" ::取字符串长度函数,调用方法:%len:#a#=结果变量名 字符串变量名% setlocal enabledelayedexpansion for /l %%a in (1,7,1024) do ( set abc=%%a (%len:#a#=slen abc%) (%d-h:#a#=abc%) (%len:#a#=dlen abc%) rem 函数调用 echo %%a转成16进制为:!abc! 转换前字符数:!slen! 转换后字符数:!dlen! ) pause 思路确实够新 对于函数的效率问题 通常情况下 应该避免在组合语句(括号对中的语句)中使用函数 这种方法,对于函数的内部结构,可读性是很差,但是对于主程序的可读性却表现得非常好 看: 使用函数的作用不就是为了简化主程序吗? 有了这种函数,就算是批处理新手,也可以轻松写出高效的批处理来, 经过这样封装的函数,是不可能会破坏主程序的结构的,4楼对len函数的使用,主程序和函数同进使用了同一个for令牌%%a却一样可以得到正确的结果。函数内部的变量使用完全是临时的,在函数结束时已经用endlocal清场,只保存返回结果。 想说些赞美的话,不好说出口。在一次创作中,突然想起netbenton这种函数的用法,于是也山寨了一个,呵呵。确实如楼主所言,发展一些高效的、正确的、常用的函数很有必要,能够充分扩展批处理的功能,使得批处理累积起更大的功能,从而实现更高的跨越式的发展。 对于重复命令调用处理的方法和技术,目前看来有几种: |
请发表评论