Board logo

标题: [原创] 批处理set /a 基本用法 [打印本页]

作者: 随风    时间: 2008-3-5 12:32     标题: 批处理set /a 基本用法

set /a 基本用法
:: code by 随风 @bbs.bathome.net 2008-03-05
set /a 是批处理中进行算术的命令。很多新手对它的常规用法都不太了解,这里作些简单通俗的介绍,
错误地方,欢迎指出。用法很多,这里只介绍几种常用的,(主要是我也只会这几种)
特点: 可进行加、减、乘、除、取余操作。 它们的符号分别是 + - * / %% set /a 可计算的数值,
单个数值且最终运算结果只能大于或等于-2的31次方,小于2的31次方",
若超出这个数,则会把这个数当作字符串来处理。 只能对整数进行计算,含小数的会忽略小数。
如:9除以2会等于4
格式:
@echo off
set /a var=1+2
echo %var%
pause
也可以连续计算,按先括弧里后括弧外,先乘除后加减的顺序
@echo off
set /a var=(1+2)*5-3/4
echo %var%
pause
赋值为数字时,还可以连续赋值。
如:set var=12 set num=3 set str=100 这时,可以利用set /a 进行连续赋值,只要用逗号分开每个变量名就可以了。
如: set /a var=12,num=3,str=100 利用逗号,在计算时也可以这样连续。
如: set /a var=1+2,num=3*5,str=100/50
另外:值得注意一点的是,在set /a 计算时,可以省略变量的%号或!号,极为方便。
如:
@echo off
set var=100
set num=220 set /a str=var-num (这句,实际就是set /a str=%var%-%num%)
echo %num%
pause
是不是方便很多。。
最后一点,取余。 符号 %%
@echo off
set /a var=100%%61
echo %var%
pause
结果是 39 其实就是用100除以61的余数。需注意的是 若需取余的数,比被取的小,那么结果就是需取余的数。
感谢16楼朋友的提醒,应该是100%%61 开始写成了200%%61
如:
@echo off
set /a var=10%%20
echo %var%
pause
结果等于 10 简单的理解为: %% 号左边的数字比又边的小结果就仍是左边的数字。
当然 取余绝不是这么简单,但我也就理解这么多了。具体的还是靠多实践吧。

[ 本帖最后由 随风 于 2009-3-17 20:56 编辑 ]
作者: 希望的寄托    时间: 2008-3-5 13:40

不错,支持随风大哥,顶啦
作者: foxJL    时间: 2008-3-5 16:06

就我知道的补充一点点:
<<,>> 逻辑移位.用途是使二进制向左或向右移位.
如十进制20的二进制是1 0100,
向左移一位10 1000,向右移一位01 010.
无符号数用0填充空出来的高位.
我们发现,左移一位后的二进制10 1000转换成十进制后正好是20*2的值,
而右移一位后01 010的十进制也刚好是20/2的值.
因为移位的速度非常快,在计算中如遇到*2或/2的时候不如这样写:

set /a 30 ^<^< 1      ::左移1位,同set /a 30*2
set /a 30 ^>^> 1      ::右移1位,同set /a 30/2

其实还有:
set /a 30 ^<^< 2      ::左移2位,同set /a 30*4
set /a 30 ^>^> 2      ::右移2位,同set /a 30/4

.
..
...

>>写成^>^>,是因为在批处理中>或<是特殊符号需通过^转义.
作者: 随风    时间: 2008-3-5 20:10

好,大家都说一点,这个教程就会慢慢完美了。
对于这个<<,>> 逻辑移位 一直是一知半解,所以也没写出来,看了foxjl的帖就明白了。
  1. set /a var=x^<^<y
  2. 公式中 ^<^< 代表乘2,y 代表用 x 乘2的次数。 (^>^> 则代表除法。)
复制代码

作者: ieutk    时间: 2008-3-5 22:33

还有这样一点要注意下
  1. @echo off
  2. for /l %%a in (1 1 10) do (
  3. set /a var=^(1+2^)*%%a-3/4
  4. call echo %%var%%
  5.     )
  6. pause
复制代码

作者: namejm    时间: 2008-3-5 23:52

  "set /a 可计算的最大数为2的31次方,最小为负2的31次方"这句话是有点问题的,准确的说法应该是: set /a 可计算的数值,单个数值且最终运算结果只能大于或等于-2的31次方,小于2的31次方",顶楼的说法中,暗指可以等于2的31次方,是不对的;同时,没有明确指出单个数值并且最终结果不能超过此范围,容易让人误解为单个数值不超过也是可行的。
作者: 随风    时间: 2008-3-6 00:14     标题: 回复 6楼 的帖子

多谢指出,已在顶楼改正。
作者: youxi01    时间: 2008-3-6 07:55

namejm同学真是一丝不苟啊!佩服!!
作者: kanlianhui    时间: 2008-3-9 18:13

@echo off
set /p a="第一运算量:"
set /p c="运算符号(+-*%%/):"
set /p b="第二运算量:"
set /a d=%a%%c%%b%
echo 运算结果为%d%
pause
作者: 青春    时间: 2008-3-29 20:18

不错,就是有些在我机子上实现不了
作者: 梦想种子    时间: 2008-3-30 16:02

<P>很热闹,那晚辈再补充些吧...<BR>平时触及到的不多,就说几个有可能用到的。(~ ! ^)</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>~ 按位取反<BR>例如:<BR>set /a num=~16&nbsp; 结果为-17<BR>set /a num=~-30&nbsp; 结果为29<BR>原理与二进制中的反码和补码等有关。<BR>在这里只给出计算公式[ ~X=-(X+1) ]<BR>“~X”可理解为,获得得小于X相反数的最大整数。</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>! 逻辑非<BR>例如:<BR>set /a num=!0 结果为1<BR>set /a num=!1 结果为0<BR>而当n非零时,!n均得到0。<BR>特别地:<BR>set /a flag=!flag 得到flag=1<BR>再执行一次上句,得到flag=0<BR>再执行一次便得到flag=1<BR>。。。依此类推。利用它的周期性可以用作某过程的开关,来标志执行情况。</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>^ 异或<BR>这是对于二进制而言的按位计算。异或的计算法则是“同假异真”。<BR>例如:<BR>左边是十进制数,右边是二进制数。<BR>52=(110100)2<BR>39=(100111)2<BR>则set /a num=52^^39&nbsp; 结果为19<BR>为什么呢?<BR>按照“同假异真”的法则:<BR>110100<BR>100111<BR>-----------<BR>010011<BR>而(10011)2正是19。</P>
<P>计算发现,反过来19异或39等于52。可见这种运算具有可逆性。<BR>于是可以利用它的可逆性做一个简单的加密解密的批处理。</P>
<P>&nbsp;</P>
<P><BR>@echo off<BR>set /p func=加密按1,解密按2:<BR>goto t%func%<BR>:t1<BR>set /p pwd=输入数字密码(8位内):<BR>set /a code=(pwd^&lt;^&lt;2)^^43690<BR>echo %code%<BR>pause&amp;exit<BR>:t2<BR>set /p code=输入数字密文:<BR>set /a pwd=(code^^43690)^&gt;^&gt;2<BR>echo %pwd%<BR>pause&amp;exit</P>

[ 本帖最后由 梦想种子 于 2008-3-30 16:18 编辑 ]
作者: 47478220    时间: 2008-4-1 10:48

学习了,一点一点积累。
作者: jvive    时间: 2008-4-3 23:39

新手前来报道,望大家多多关照
作者: beyond_00    时间: 2008-4-4 01:36

好东西啊 ,谢谢~~~~!
作者: wuwenping    时间: 2008-4-22 14:36

太厉害了
佩服佩服
看诸君一席话 胜读十年书!!
作者: kousei    时间: 2009-3-17 20:27

来到这里主要想学习一下关于 set /a  的取余知识。
但是经过试验,楼主貌似写的不太正确哦。本人挑一点小毛病哈。
-----------------------------------------------------------------
@echo off
set /a var=200%%61
echo %var%
pause
结果是 39 其实就是用200除以61的余数。
----------------------------------------------------------------

现在本人基本上已经明白取余的意思了。还学习了逻辑移位。谢谢。
作者: myzwd    时间: 2009-3-17 22:07     标题: 我也说2句

左移1位就是乘2 ,  左移2位就是乘2个2,  左移3位就是乘3个2
右移位与左移位类似,只是除以2.
还有就是set /a在使用时,最好是加引号.象这样  set /a "x=2<<1"我觉得这种写法更规范一点。



还有一点,如果你调用你本机的计算器的话,在本机的计算器上学习理解这些算术运算和逻辑运算也许是
个好方法。
因为你本机的计算器上所有这些运算都有。尤其是可以方便的进行进制转换。你可以在不同的进制下验证这些运算。
说的不对请指正哈。

[ 本帖最后由 myzwd 于 2009-3-17 22:11 编辑 ]
作者: 5810239q    时间: 2009-3-25 16:22

努力学习中。。。谢谢了
作者: Hello123World    时间: 2011-9-22 21:19

最近是在百度知道打酱油吧,小楼随风?
作者: xslxslxsl    时间: 2011-9-25 18:24

很好哦的教程,在此学习过了。
作者: zaixinxiangnian    时间: 2011-9-26 17:32

在此看明白了取余用法 和  逻辑移位




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2