C语言位操作符的使用
?C語言的設計具備了匯編語言的運算能力,它支持全部的位操作符。位操作符是對字節或字中的位進行測試、置位或移位處理,在對微處理器的編程中,特別適合對寄存器、I/O端口進行操作。
6種偉操作符:
(1) & :按位“與”——僅當兩個操作數為1時,結果為1,否則為0。如:1000 1000? & 1000 0001? = 1000 0000;
(2) | :按位“或”——僅當兩個操作數為0時,結果為0,否則為1。如:1000 1000?| 1000 0001 = 1000 1001;
(3) ^:按位“異或”——僅當兩個操作數不同時,相應的輸出結果才為1,否則為0。
?????????????? 如:1000 1000?^ 1000 0001 = 0000 1001?;
(4) ~ :“取反”——把1置為0,0置為1。如:~1000 1000 = 0111 0111;
(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,而右移一位等效于除以2。
如:x = 7,?二進制表達為:0000 0111,
x < < 1???????????????0000 1110,相當于:?x =2*7=14,
x < < 3???????????????0111 0000,相當于:?x=14*2*2*2=112
x < < 2???????????????1100 0000,?????????????x= 192
在作第三次左移時,其中一位為1的位移到外面去了,而左邊只能以0補齊,因而便不等于112*2*2=448,而是等于192了。當x按剛才的步驟反向移動回去時,就不能返回到原來的值了,因為左邊丟掉的一個1,再也不能找回來了:
x > > 2??????????????0011 0000,??????????x=48
x > > 3??????????????0000 0110????????????x=48/8=6
x > > 1??????????????0000 0011????????????x=6/2=3
(3)將寄存器指定位置為1
PORTA?|= (1<<n)? 將porta的第n為置為1,其他為不變。比如說,你如果想將第4位置1,就使用:
PORTA | = (1<< 4)?就行了。當然,也可以使用:
PORTA | = (1<< 7) | (1<< 4 ) | (1<< 0)?這樣的指令一次將設第8、5和1位置1,但又不影響到其它位的狀態。
(4)將寄存器指定位置為0
PORTA &= ~(1<<n )
這條指令將寄存器的任意位清0,而又不影響其它位的現有狀態。比如說,你如果想將第4位清0,就使用:
PORTA & = ~ (1<< 4)?就行了。
?
下面是POJ 3748題,應用了位操作符:
/*
位操作
Description
假設你工作在一個32位的機器上,你需要將某一個外設寄存器的第X位設置成0(最低位為第0位,最高位為第31位),
將第Y位開始的連續三位設置成110(從高位到低位的順序),而其他位保持不變。對給定的寄存器值R,及X,Y,
編程計算更改后的寄存器值R。
Input
僅一行,包括R,X,Y,以逗號","分隔,R為16進制表示的32位整數,X,Y在0-31之間且Y>=3,(Y-X)的絕對值>=3,保證兩次置位不會重合
Output
更改后的寄存器值R(16進制輸出)
Sample Input
12345678,0,3
Sample Output
1234567c
Source
?*/
#include <stdio.h>
int main()
{
?int R, X, Y;
?scanf("%x,%d,%d",&R,&X,&Y);
?R &= ~(1<<X);?????? // 將R的第X位設置為0
?R |= (1<<Y);??????? // 將R的第Y位設置為1
?Y--;
?R |= (1<<Y);??????? // 將R的第Y-1位設置為1
?Y--;
?R &= ~(1<<Y);?????? // 將R的第Y-2位設置為0
?printf("%x/n",R);
?return 0;
}
總結
以上是生活随笔為你收集整理的C语言位操作符的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: const 和 #define区别
- 下一篇: 如何访问固定的内存位置?