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

[数值计算] [分享]批处理位运算演示

在论坛里看到netbenton的那个不用call调用函数的帖子(下面贴有链接)后,突然记起以前自己写的一个位运算演示的代码(用call来调用函数,现改用netbenton的方法另类的调用),现拿出来和大家分享一下,希望能给初学者一些小小的帮助...

批处理函数的高效另类应用方法
  1. @echo off
  2. title 位运算示例   code by:cn-bathome-more
  3. echo.
  4. echo.位运算名词解释(个人理解):
  5. echo.
  6. echo.位运算: 按操作数在计算机内表示的二进制数逐位进行逻辑运算或移位运算.
  7. echo.与:   全部都是1才为1(指返回值,下同),否则为0.
  8. echo.或:   只要有1则为1,否则为0.
  9. echo.异或: 不同为1,相同为0.
  10. echo.取反: 是1则0,是0则1(单目运算符).
  11. echo.取负: 先取反再加1(单目运算符).
  12. echo.左移n位: 相当于乘以2的n次方(用0补位).
  13. echo.右移n位: 相当于除以2的n次方(负数用1补位,正数用0补位).
  14. echo.
  15. echo.下面的示例是在三十二位系统(数值范围:-2147483648~2147483647)下运行的结果.
  16. echo.请输入批处理能处理的数值(整数),否则将不能正确处理.如发生溢出,结果也不会正确.
  17. echo.
  18. rem 将十进制转换为二进制的函数.
  19. 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))"
  20. setlocal enabledelayedexpansion
  21. :agn
  22. set in=&set /p in=请输入两个数(中间用空格隔开):
  23. if not defined in exit
  24. set n=0
  25. for %%a in (%in%) do (
  26.    set /a n+=1
  27.    set /a num!n!=%%a 2>nul
  28. )
  29. cls
  30. echo.输入的两个数的有效数值为: "!num1!" 和 "!num2!", 用二进制表示分别为:
  31. set /a str1=num1,str2=num2
  32. %fun_d2b:#a#=str1%
  33. %fun_d2b:#a#=str2%
  34. echo.&echo.!str1!  ==^> !num1!
  35. echo.!str2!  ==^> !num2!
  36. echo.&echo.各种位运算的结果如下:
  37. set /a "num=!num1!&!num2!,t=num"
  38. %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位与:   !num1! ^& !num2! = !t!
  39. set /a "num=!num1!|!num2!,t=num"
  40. %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位或:   !num1! ^| !num2! = !t!
  41. set /a "num=!num1!^^!num2!,t=num"
  42. %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位异或: !num1! ^^^^ !num2! = !t!
  43. set /a "num=~!num1!,t=num"
  44. %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位取反:    ~(!num1!) = !t!
  45. set /a "num=-!num1!,t=num"
  46. %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 取负:        -(!num1!) = !t!
  47. set /a "ran=%random%%%5+2,num=!num1!,num<<=ran,t=num"
  48. %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 左移!ran!位:   !num1! ^<^< !ran! = !t!
  49. set /a "ran=%random%%%5+2,num=!num1!,num>>=ran,t=num"
  50. %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 右移!ran!位:   !num1! ^>^> !ran! = !t!
  51. echo.&goto :agn
复制代码
1

评分人数

看不懂
什么意思啊

TOP

回复 1# more

有个需要注意的地方:
批处理逻辑位运算要用双引号括起来,set /a "t=1%%b&1"  就好似用 | 命令时要用^转义

TOP

返回列表