| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1254 人关注过本帖
标题:按位操作符
只看楼主 加入收藏
房屋的一角
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-11-20
收藏
 问题点数:0 回复次数:6 
按位操作符
虽然已经学到了第五章,但仍然对按位(与,或,异或,)按位(与,或,异或,)赋值无法理解.想想还是编程论坛是一个解决问题好地方.现在把这个问题拿出来,希望大家指点指点.感谢大家!
搜索更多相关主题的帖子: 操作符 
2008-11-30 18:26
p1s
Rank: 4
等 级:贵宾
威 望:10
帖 子:454
专家分:3
注 册:2005-11-4
收藏
得分:0 
按位与、或、异或并不是高级语言应该讨论的东西。老实说如果不编写驱动程序的话这些操作还真的很少会用到。通常在单片机和汇编里面经常会用到这些操作。你可以看一些诸如数字逻辑等逻辑计算方面的书,那里面会对这些操作有比较详细的介绍。高级语言的书未必都有介绍这些操作。
2008-11-30 21:57
房屋的一角
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-11-20
收藏
得分:0 
plsk兄弟,你好,即使很少用到,我也想理解,请问你有这样的书籍吗,能否发来看看谢谢
2008-12-01 09:59
wqstar028
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-12-1
收藏
得分:0 
按位与、或、异或见下面:
一,位与:两个数据对应位上的数据只要有一个为0,则结果就为0
也就是说:
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
如:00110101&01001001
两个数据位与结果为:
  00110101
 &01001001
---------
  00001001
位与一般可以用于数据的过滤,需要的位就用1来与,不需要的就是0来与

二,位或:两个数据中对应位上只要有一个是1,那结果就为1.
也就是说:
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

如:00110101|01001001
结果为:
  00110101
 |01001001
 ---------
  01111101

三,位异或:两个数据对应位中数据相同则结果为0.否则为1,
也就是说:
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
如:00110101^01001001
 00110101
 ^01001001
 ---------
 01111100

某一个数与同一个数进行两次异或后就会复原,因此,我们通常可以用异或来为数据加密,其中加密与解密用的方法是相同的,第一次异或后就相当于进行加密了,再用同一个数据进行一次异或就相当于解密了.

顺便说一下,有时候我们可以利用位段把两个或更多的数据放在同一个变量当中,然后作为函数的返回值,传回调用这个函数的函数中,那么我们要怎么把合并后的数据进行分解呢?
其实也简单,比如我们要把234,241,129三个数放在同一个变量里
int funa()
{
int a;
a=234<<8|241;//将数据234向左移八位然后再与241进行位或,这样就把234与241两个数写入变量a了;
a=a<<8|129;//变量a的数据向左移八位后再与129进行位或,这样129与被写入变量a了;
return a;//然后返回数据;
}
main()
{
int a,b,c,m;
m=funa();//将返回值取出;
a=m>>16;//将返回值向右移16位,这样就把低十六位的数据给去掉了,得到的就是返回值中的234
b=(m>>8)&255;//将返回值向右移8位,这样低八位的数据就是241,所以我们得过255这个数把高24位过滤掉.
c=m&255;//同理,低八位的数据是192,用255把高24位过滤掉.
printf("m=%d\na=%d b=%d c=%d\n",m,a,b,c);
return 0;
}
注意:32位的255的二进制形式为:00000000000000000000000011111111

[[it] 本帖最后由 wqstar028 于 2008-12-1 13:36 编辑 [/it]]

我也是新手,还望高手多多指教!
2008-12-01 13:34
房屋的一角
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-11-20
收藏
得分:0 
我明白了!只要操作数转换成二进制,再按照上述规律做就行了.wqstar028兄弟,谢谢了.真是一点就通啊!谢谢各位了!
2008-12-02 19:27
carmeloyin
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
帖 子:161
专家分:157
注 册:2008-12-2
收藏
得分:0 
说到这里我想问个简单的问题

要求是输入一串1和0,注意,是一个十进制的一长串,比如100011100101001010
我随便输入任意长度由1和0构成的数字
要求输出正好向反
比如输出011100011010110101
这个程序怎么写呢?
2008-12-02 20:18
wqstar028
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-12-1
收藏
得分:0 
如果你输入的是一个数值型的由1和0组成的十进制数,那我这里想到一个笨方法:先把这一串数字转成字符串,存在一个数组变量里面,然后每个字符都用49去减,得到的结果就成了由1和0组成的字符串数组,再把这个转成数值.

[[it] 本帖最后由 wqstar028 于 2008-12-3 00:27 编辑 [/it]]

我也是新手,还望高手多多指教!
2008-12-03 00:25
快速回复:按位操作符
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011599 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved