标题: 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 里面的运算没什么区别。
…………………………不要逼我写…………………………-_-!
[
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
稀里糊涂的