Board logo

标题: set/a里的位运算怎么用? [打印本页]

作者: 不得不爱     时间: 2006-10-18 03:19
Originally posted by pengfei at 2006-10-17 23:11: 有意思, qwe1234567版主第一楼取余数时忘记了cmd和批处理下"%"与"%%"号的差别. 输入行太长, 这可能是因为系统为环境变量分配的内存空頮..
这能怪我吗,也是微软没有说清楚SET/A的用法,就SET /A相信大家多不会使用所有的被评估的数字表达式吧,就下面的你会多少? () - 分组 * / % - 算数运算符 + - - 算数运算符 << >> - 逻辑移位 - 按位“与” ^ - 按位“异” | - 按位“或” = *= /= %= += -= - 赋值 &= ^= |= <<= >>= , - 表达式分隔符 我想除了* / %+ - = *= /= %= += -= -会用,其他的都不会用吧,呵呵!

作者: electronixtar     时间: 2006-10-18 04:31
其他的都是位运算。学过C的都知道

作者: 不得不爱     时间: 2006-10-18 19:54
Originally posted by electronixtar at 2006-10-18 04:31: 其他的都是位运算。学过C的都知道
那怎么用?

作者: electronixtar     时间: 2006-10-18 21:59
C语言里的教程,如果还是没有搞懂的话,我可以考虑写一个bat的示例。位运算是计算机比较本质的运算,特点是效率高,缺点是不好用,呵呵
位运算   前面介绍的各种运算都是以字节作为最基本位进行的。 但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。   一、位运算符C语言提供了六种位运算符:   & 按位与   | 按位或   ^ 按位异或   ~ 取反   << 左移   >> 右移   1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。   例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。   按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。 main(){  int a=9,b=5,c;  c=a&b;  printf("a=%d\nb=%d\nc=%d\n",a,b,c); }   2. 按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。    例如:9|5可写算式如下: 00001001|00000101 00001101 (十进制为13)可见9|5=13 main(){  int a=9,b=5,c;  c=a|b;  printf("a=%d\nb=%d\nc=%d\n",a,b,c); }   3. 按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12) main(){  int a=9;  a=a^15;  printf("a=%d\n",a); }   4. 求反运算 求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110   5. 左移运算 左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,   高位丢弃,低位补0。例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。6. 右移运算 右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。   例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。 main(){  unsigned a,b;  printf("input a number: ");  scanf("%d",&a);  b=a>>5;  b=b&15;  printf("a=%d\tb=%d\n",a,b); }   请再看一例! main(){  char a='a',b='b';  int p,c,d;  p=a;  p=(p<<8)|b;  d=p&0xff;  c=(p&0xff00)>>8;  printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d); }
[ Last edited by electronixtar on 2006-10-18 at 22:06 ]

作者: 不得不爱     时间: 2006-10-18 22:01
可是你那是C语言啊,我要的是CMD下可以用的

作者: redtek     时间: 2006-10-18 22:24
electronixtar懒得写,哈哈……

作者: redtek     时间: 2006-10-18 22:30
很多教程(多数教程)上写的位运算(几乎)都象是教科方式的灌输找不到让人激动地方:) 就象学生时代学习数学一样,除了几何还能让人知道这东东做什么用以外, 象是什么微机分等等一大堆看着想自杀的内容,书上并没有说这些东东的实用性, 可是到了财务分析应用的时候,这些还都是必须的,等这时候再看公式早TMD忘了:) 很多课程教育太死板~:)

作者: electronixtar     时间: 2006-10-18 22:30
……个人认为 cmd 下的和 C 里面的运算没什么区别。
electronixtar懒得写,哈哈……
…………………………不要逼我写…………………………-_-! [ Last edited by electronixtar on 2006-10-18 at 22:35 ]

作者: redtek     时间: 2006-10-18 22:36
哈哈……同意~:)

作者: NaturalJ0     时间: 2006-10-18 22:38
有几个真的不会用,有空就写几个吧。 = =b

作者: redtek     时间: 2006-10-18 22:43
建议electronixtar兄现在就新开一个关于讨论批处理位运算的专贴:)

作者: redtek     时间: 2006-10-18 22:48
这些符号的运用大家都会用,书上等都说得很清楚:) 不过,我非常不喜欢书上或教科书上的教学方式, 它并不能让人一眼看到位运算的课程就立即产生那种使人着迷、废寝忘食、疯狂和一定要现在就试试的想法…… 所以,这是教学方式的失败! 应该是这样的,看完之后练习之后……   “噢,原来是这样!”   “天哪!在没看到这篇教程以前,我居然走了10年的弯路!!!”   “啊!原来位运算这么神奇,它可还可以做五字棋等游戏的智能运算……”      等等……   我最不喜欢教科书上说的,一大堆运算就是不说明这些计算在现实生活中和编程中的应用启发……

作者: 不得不爱     时间: 2006-10-18 22:52
Originally posted by electronixtar at 2006-10-18 22:30: ……个人认为 cmd 下的和 C 里面的运算没什么区别。 …………………………不要逼我写…………………………-_-!
那你就写个纯CMD下的位运算来我们看看!我还真要逼你写,呵呵,相信大家都希望看到CMD下的位运算吧。

作者: electronixtar     时间: 2006-10-18 22:53
这个……你们够~~

作者: NaturalJ0     时间: 2006-10-18 22:55
写吧,我们期待着。 PS:插句题外话,为何我刷新时,经常会刷到别的帖子,过会儿,又会刷回这帖,怪事,而且碰到不止一次了。

作者: pengfei     时间: 2006-10-18 22:56
嘎嘎~ 教科书上的东西都是死的, 最主要的是懂得灵活运用...

作者: 不得不爱     时间: 2006-10-18 22:57
没有办法啊,微软没有这方面的说明啊

作者: redtek     时间: 2006-10-18 22:57
建议版主和electronixtar 开新贴 讨论关于批处理位运算的贴子:) 因为在批处理中运用位运算的方案极少,这些位运算大多用在游戏里非常精彩~:) 所以,如果开新贴讨论的话有几点好处: ) 增加论坛的高级精华内容(别的论坛上极少提到并应用到的内容) ) 方便将来检索这个位运算的知识点 ) 通过大家一起增加内容讨论这个位运算,让它活起来~!增加人气!增加高级人气(噢~那叫增加仙气~:)

作者: electronixtar     时间: 2006-10-18 22:59
我什么都没看见~~~我什么都没说,我什么都不知道~~ (偷偷的拖出记事本写代码,ntcmds.chm看帮助文档 -_-! )

作者: pengfei     时间: 2006-10-18 22:59
Originally posted by qwe1234567 at 2006-10-18 22:57: 没有办法啊,微软没有这方面的说明啊
呵呵~ 就像namejm兄说的, cmd的帮助好似天书一样...

作者: electronixtar     时间: 2006-10-18 23:02
namejm在一旁偷笑呢,唉,本来在写vbs不规则窗体代码的,这下又断了。晕 Wengier快来啊,这里有一群人在版聊, qwe1234567 版主带头版聊,把他们都封IP啊~~~ [ Last edited by electronixtar on 2006-10-18 at 23:05 ]

作者: electronixtar     时间: 2006-10-18 23:06
set /a a=0x01
set /a b=0x02
set /a c=0x01
set /a d=a^&b
set /a e=a^&c
运行结果:
C:\Documents and Settings\est>set /a c=a^&b 0 C:\Documents and Settings\est>set /a d=0x1 1 C:\Documents and Settings\est>set /a c=a^&d 0 C:\Documents and Settings\est>set /a c=b^&d 0 C:\Documents and Settings\est>set /a a=0x01 1 C:\Documents and Settings\est>set /a b=0x02 2 C:\Documents and Settings\est>set /a c=0x01 1 C:\Documents and Settings\est>set /a d=a^&b 0 C:\Documents and Settings\est>set /a e=a^&c 1 C:\Documents and Settings\est>
写完了,闪人

作者: redtek     时间: 2006-10-18 23:07
Originally posted by electronixtar at 2006-10-18 23:02: namejm在一旁偷笑呢,唉,本来在写vbs不规则窗体代码的,这下又断了。晕 Wengier快来啊,这里有一群人在版聊, qwe1234567 版主带头版聊,把他们都堮..
写个批处理下彩票算号还有意思,什么时候用你写的批处理中了500万我给你10万,哈哈……

作者: redtek     时间: 2006-10-18 23:09
给electronixtar加一分~:)

作者: 不得不爱     时间: 2006-10-19 05:08
——————————————————版务纪录—————————————————— 执行:qwe1234567 操作:分割主题 说明:本主题是原来 我发现CMD里的每行字符限制数 里的部分帖子,因为讨论的内容与原贴内容不同 ————————————————————————————————————————

作者: lxmxn     时间: 2006-10-19 07:04
  多谢est兄写了关于位运算的帖子。   但是没有写出这位运算到底有哪些方面的应用,提不起大家对位运算的兴趣。大家只知道几个位运算的结果,自己分析一下也出来了,但是这位运算究竟可以用在哪些方面呢?我认为举一个位运算的实际应用的例子来更能说明问题。      强烈建议 electronixtar 兄.........呵呵,你知道我的意思了吧...... d= =b

作者: electronixtar     时间: 2006-10-19 07:25
那好吧,我提一个方向大家研究研究,用批处理做 base64 编码,会把位运算用的很爽的 [ Last edited by electronixtar on 2006-10-19 at 07:29 ]

作者: 不得不爱     时间: 2006-10-19 08:43
太好了,这正是我们需要的。

作者: redtek     时间: 2006-10-19 10:14
Originally posted by electronixtar at 2006-10-19 07:25: 那好吧,我提一个方向大家研究研究,用批处理做 base64 编码,会把位运算用的很爽的 [ Last edited by electronixtar on 2006-10-19 at 07:29 ]
这么好玩的想法你要开新贴啊~:) 把非常吸引人的内容留在外面(标题上要有),这样会有更多的人一进论坛就看到,又是宣传和人气~:) BASE64编码用DOS批处理不借助外部工具读二进制再编码可真难啊:( 估计VBS合适?

作者: electronixtar     时间: 2006-10-19 12:08
js合适。js也支持位运算

作者: vkill     时间: 2006-10-19 21:24
还看的晕忽忽

作者: lxmxn     时间: 2006-10-20 00:18    标题: 提供关于BASE64编码的资料

  算出了base64转换后的编码之后,还要与相关的字符对应:
A ----------- 0 B ----------- 1 C ----------- 2 D ----------- 3 E ----------- 4 F ----------- 5 G ----------- 6 H ----------- 7 I ----------- 8 J ----------- 9 K ----------- 10 L ----------- 11 M ----------- 12 N ----------- 13 O ----------- 14 P ----------- 15 Q ----------- 16 R ----------- 17 S ----------- 18 T ----------- 19 U ----------- 20 V ----------- 21 W ----------- 22 X ----------- 23 Y ----------- 24 Z ----------- 25 a ----------- 26 b ----------- 27 c ----------- 28 d ----------- 29 e ----------- 30 f ----------- 31 g ----------- 32 h ----------- 33 i ----------- 34 j ----------- 35 k ----------- 36 l ----------- 37 m ----------- 38 n ----------- 39 o ----------- 40 p ----------- 41 q ----------- 42 r ----------- 43 s ----------- 44 t ----------- 45 u ----------- 46 v ----------- 47 w ----------- 48 x ----------- 49 y ----------- 50 z ----------- 51 0 ----------- 52 1 ----------- 53 2 ----------- 54 3 ----------- 55 4 ----------- 56 5 ----------- 57 6 ----------- 58 7 ----------- 59 8 ----------- 60 9 ----------- 61 + ----------- 62 / ----------- 63

作者: electronixtar     时间: 2006-10-20 00:55
各路高手亮本事的时候到了 base64编码用处还是蛮多的,比如说eml文件、批处理内嵌bin等 [ Last edited by electronixtar on 2006-10-20 at 01:08 ]

作者: 不得不爱     时间: 2006-10-20 07:19
set/a里的位运算其他的给我们说下好吗?

作者: redtek     时间: 2006-10-20 10:32
Originally posted by lxmxn at 2006-10-19 07:04:   多谢est兄写了关于位运算的帖子。   但是没有写出这位运算到底有哪些方面的应用,提不起大家对位运算的兴趣。大家只知遠...
这个主意好~:) 写些能让大家感兴趣又实用的位运算的例子来~:) 又聚人气又为开发打基础又增加了知识范围~:)

作者: electronixtar     时间: 2006-10-20 21:57
说实话,我是直接把其他语言里的位运算照搬过来改成 set /a 的。真的没什么写头。

作者: smlz1213     时间: 2007-8-19 11:53    标题: ```

`

作者: knoppix7     时间: 2007-8-19 12:14
////// 写,我们期待着。

作者: solomon9813     时间: 2007-8-22 23:30
hehe ,说道心里去了

作者: plp626     时间: 2008-3-2 23:33

作者: pooronce     时间: 2008-3-3 10:53
楼主啊,你得先弄懂10进制2进制转化啥的啊 我举几个简单例子说明CMD下的位操作吧 set /a 13^<^<1 结果是26,因为13的二进制是1101,左移1位就相当于在二进制末尾加一个0,就是11010,也就是26了。 set /a 13^>^>1 结果是6,1101去掉末位1后,为110,也就是10进制6了 同样 set /a 13^<^<2为52 set /a 13^>^>2为3 再说按位与& 按位与的意思是转化成二进制后,位对应进行逻辑与操作的结果,与操作的算法是全1则1,否则0. set /a 13^&11 结果是9 因为1101&1011,中间两位各有一0,只有首尾两位都是1,所以是1001了,也就是10进制9了 明白位操作是位对应操作了,就不用再赘述异和或了,只说下异及或的算法 异又称异或(对应的有同或),算法是相同的两数操作得0,不同得1,也就是0^1=1,1^1=0,0^0=0。 而或操作呢,是全0则0,也就是0|1=1,1|1=1, 0|0=0了

作者: jha334201553     时间: 2009-4-23 12:42
@echo off set b=0 for /l %%a in (1,1,100) do set /a b=b+%%a>>nul echo 一加到一百等于:%b% pause>nul 高手们: set /a a=00000010 "<<" 2 是什么意思啊?

作者: Lying     时间: 2010-6-26 10:34
稀里糊涂的