题记:前几个月我们班班长跟我说她对位运算还是不太明白,叫俺给讲讲,于是有了下文……
【以下为大致意思】
班长:“唉~~这C语言可真难,你说这可怎么办?” <--学呗……
我 :“” <--当时正忙到紧要关头,没回复。
班长:“今天老师讲的位运算不知道你会不?你都没来听课,肯定早就会了……”
我 :“你没听懂?”
班长:“恩!这可怎么办呀,急死了!你能给我讲讲吗……”
我 :“我过会在网上给你传点东西,你看完了就明白了,现在我们宿舍有人睡觉,咱们先别发短信了。”
晚上没事了,一时兴起,全屏个人感觉写出下文,发到博客前我又整理了下格式,希望对刚刚学C的朋友有用……
按位与 &
0&0=0 0&1=0 1&0=0 1&1=1
例如:
00000011
& 00000101
------------
00000001
解释:“与”即为连带关系,例如某人与某人,某物与某物。
假如我说一句话“小猫与小狗是动物”,这句话是对的。
假如我说一句话“小明与小狗是动物”,这句话就是错的,因为小明是人类。
///////////////////////////////////////////////////////////////
按位或 |
0|0=0 0|1=1 1|0=1 1|1=1
例如:
00000011
| 00000101
------------
00000111
解释:“或”即为选择关系。例如向左走或向右走,吃饭或睡觉。
假如我说一句话“小明或小狗是人类”,这句话是对的。
假如我说一句话“小猫或小狗是人类”,这句话就是错的,因为这里根本没有人类。
///////////////////////////////////////////////////////////////
异或 ^
0^0=0 0^1=1 1^0=1 1^1=0
例如:
00000011
^ 00000101
------------
00000110
解释:“异或”即为有限定的选择关系。例如走路异或是坐车,用钢笔异或是用铅笔。
语境:这个面包谁偷吃了?
假如我的回答为“小明异或是小狗”,这句话是对的。
假如我的回答为“小明异或是小明”,这句话是错的,因为作为“小明”的只有一个对象。
那么怎样的情况下第二句话才正确呢?就是同时有两个叫做“小明”的孩子。
///////////////////////////////////////////////////////////////
取反 ~
~0=1 ~1=0
例如:
00000011
~
------------
11111100
解释:“取反”即为取得相反目的的行为。例如将“生”取反即为“死”,这个就不用解释了吧?
///////////////////////////////////////////////////////////////
左移运算符 <<
高位溢出,低位补0
例如:
<<1 <<2
01000000 10000000 00000000
01111111 11111110 11111100
解释:由于系统底层读取数据是按照由低地址到高地址读取,例如010011的读取顺序为1>1>0>0>1>0,而当将其向左移位后,计算机要新开辟一个BIT的空间将其补够8位,又因为计算机开辟新空间的初始状态下都为0,所以就造成了向左位移时用0补齐的情况。
///////////////////////////////////////////////////////////////
右移运算符 >>
高位不定,低位溢出
例如:
>>1 >>2
01000000 00100000 00010000
01111111 00111111 00011111
10000111 11000011 11100001
10111000 11011100 11101110
解释:我上面的例子是针对咱们的教科书,实际情况是根据计算机CPU的不同,右移的结果也不尽相同,有的就像上面那样,如果右移前符号位为负数(就是第一位为1),那么为了保证结果的可操纵性,不足的高位仍然用1补齐,这样可保证右移后的数符号不会发生变化。有的则不会那么负责,直接用默认的初始BIT将其补齐,也就是都用0补齐了。
评论