标题: [数值计算] [分享]批处理位运算演示 [打印本页]
作者: more 时间: 2009-9-24 21:24 标题: [分享]批处理位运算演示
在论坛里看到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
复制代码
作者: 爱你 时间: 2009-9-25 20:41
看不懂
什么意思啊
作者: wxyz0001 时间: 2019-10-28 14:02
回复 1# more
有个需要注意的地方:
批处理逻辑位运算要用双引号括起来,set /a "t=1%%b&1" 就好似用 | 命令时要用^转义
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |