【一】位运算符
共有6种位运算符,如下:【1】& 与运算符 解释: &(与)运算要求有两个运算值,然后返回一个值,当且仅当两个运算值都位1时,返回值为1
【2】 | 或运算符 解释:|(或)运算符要求两个运算值,然后返回一个值,当且仅当两个运算值中有一个为1或都为1时,返回值为1
【3】 ^ 异或运算符 解释:^ (异或)运算符要求有两个运算值,然后返回一个值,当且仅当两个运算值中有一个为1但不同时为1时,返回值为1
【4】 ~ 取反运算符 解释:~(取反)运算符只要求一个运算值,然后将所有的1变成0,所有的0变成1。使用取反运算可以将某些字节置0,确保其它字节置1
【5】 << 左移运算符 解释:“左移”——将变量的各位按要求向左移动若干位。如:0000 1000 <<3 = 0100 0000;
【6】>> 右移运算符 解释:“右移”——将变量的各位按要求向右移动若干位。如:0000 1000>>3=0000 0001;
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
【二】应用
【1】交换变量
例如,若有变量a = 3,b = 4,想要交换它们的值,可以做如下一组操作:
a ^ = b 以后可以用这个方法交换变量 不用引入第三变量
b ^ = a
a ^ = b
首先,a ^ = b:
a 0000 0011
^ b 0000 0100
a = 0000 0111
其次,b ^ = a:
b 0000 0100
^ a 0000 0111
b = 0000 0011
最后,a ^ = b:
a 0000 0111
^ b 0000 0011
a = 0000 0100
这样,a、b两个变量中的值就进行了对调。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
【2】快速乘除运算 在二进制中向左一位相当于乘二 向右一次相当于除2;
特别注意对某变量进行移位操作时,变量本身不会变。byte、short和char类型移位后的结果会变成int类型。表达式int a=(b<<24)+(c<<16)(b,c为char型)是正确的虽然b、c均只有8位。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
【3】将寄存器指定位置为1或者0
PORTA |= (1<<n) 将porta的第n为置为1,其他为不变。比如说,你如果想将第4位置1,就使用:
PORTA | = (1<< 4)就行了。当然,也可以使用:
PORTA | = (1<< 7) | (1<< 4 ) | (1<< 0)这样的指令一次将设第8、5和1位置1,但又不影响到其它位的状态0也是一样;
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
目前应用
【1】现在可以处理无法交换两个变量的问题;
【2】当用于乘除时,可以减少程序占用,只有一个字节;
【3】至于换0 1这个操作,目前还没有好的例子来做,暂时没有用;
【4】还有两个数之间的各种位运算,暂时没什么用