Board logo

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

作者: 不得不爱     时间: 2006-10-18 03:19


  Quote:
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


  Quote:
Originally posted by electronixtar at 2006-10-18 04:31:
其他的都是位运算。学过C的都知道

那怎么用?
作者: electronixtar     时间: 2006-10-18 21:59
C语言里的教程,如果还是没有搞懂的话,我可以考虑写一个bat的示例。位运算是计算机比较本质的运算,特点是效率高,缺点是不好用,呵呵

  Quote:
位运算

  前面介绍的各种运算都是以字节作为最基本位进行的。 但在很多系统程序中常要求在位(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 里面的运算没什么区别。

  Quote:
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


  Quote:
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


  Quote:
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
运行结果:

  Quote:
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


  Quote:
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


  Quote:
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转换后的编码之后,还要与相关的字符对应:

  Quote:
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


  Quote:
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
稀里糊涂的