按位与、或、异或见下面:
一,位与:两个数据对应位上的数据只要有一个为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]]