c語言bit操作
㈠ 為什麼c語言能進行位(bit)操作
在編程時,有時要為程序定義很多bool型變數
比如:
struct XX{
bool bReady,bLoaded,bRender,bShow;
};
這樣很羅嗦,我們換一種方法:1個32位的long型變數 本身可以代表32個bool型
我們先定義
#define FLAG_READY 0x0001
#define FLAG_SHOW 0x0002
#define FLAG_LOADED 0x0004
這樣
再搞一個 long Flag;變數
設置和取消該標志位用 Flag|=FLAG_SHOW 和 Flag&=~FLAG_SHOW
判斷使用 if (Flag & FLAG_SHOW) {...}
比以前的方便,而且Microsoft 的函數API很多都是這種方式
㈡ c語言的按位運算符怎麼操作!
位運算
在很多系統程序中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能, 這使得C語言也能像匯編語言一樣用來編寫系統程序。
一、位運算符C語言提供了六種位運算符:
& 按位與
| 按位或
^ 按位異或
~ 取反
<< 左移
>> 右移
1. 按位與運算 按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。
按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數為0000000011111111)。
main(){
int a=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
2. 按位或運算 按位或運算符「|」是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如:9|5可寫算式如下: 00001001|00000101
00001101 (十進制為13)可見9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
3. 按位異或運算 按位異或運算符「^」是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下: 00001001^00000101 00001100 (十進制為12)
main(){
int a=9;
a=a^15;
printf("a=%d\n",a);
}
4. 求反運算 求反運算符~為單目運算符,具有右結合性。 其功能是對參與運算的數的各二進位按位求反。例如~9的運算為: ~(0000000000001001)結果為:1111111111110110
5. 左移運算 左移運算符「<<」是雙目運算符。其功能把「<< 」左邊的運算數的各二進位全部左移若干位,由「<<」右邊的數指定移動的位數,
高位丟棄,低位補0。例如: a<<4 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。6. 右移運算右移運算符「>>」是雙目運算符。其功能是把「>> 」左邊的運算數的各二進位全部右移若干位,「>>」右邊的數指定移動的位數。
例如:設 a=15,a>>2 表示把000001111右移為00000011(十進制3)。應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時, 最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。Turbo C和很多系統規定為補1。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d\tb=%d\n",a,b);
}
請再看一例!
main(){
char a='a',b='b';
int p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}
㈢ 為什麼C語言能進行對位(bit)操作 對位操作有什麼效果
當然可以對位進行操作。
一般來說,用位運算就是對位操作。位運算包括
^ 異或
| 位或
& 位與
~ 位求反
>> 右移位
<< 左移位
對位操作的好處是快,並且基本上和匯編一一對應,可以直接算出運算時間,計算速度。
很多要表達硬體計算,或者提高運算速度的時候,都會直接用位運算。
比如乘16,位運算就是左移4位等等。
另外一種是位域。
就是定義一種特殊的結構體,裡面的成員只有規定的幾位。
比如
struct instruction{
unsigned short sr:5;
unsigned short tr:5;
unsigned short op:6;
};
就定義了一個16bit指令的結構,其中
sr : tr : op
1-5 : 6-10 :11-16
然後就可以這樣操作
struct instruction mov_r1_r3 = {0x01, 0x03, 0x01};
那麼mov_r1_r3實際上等於0x0461
這樣編代碼一般是為了和硬體介面容易,完全的底層操作
實際代碼中極少出現,一般出現於與硬體的介面當中.
㈣ C語言中sbit是什麼意思,與bit有什麼區別
1.C語言中沒有sbit關鍵字,這個是編譯器裡面的關鍵字。 sbit應該是keil c51中的關鍵字,表示位寄存器。一個埠8位,用這個關鍵字,可以單個位操作。
2.bit和sbit都是C51擴展的變數類型。典型應用是:sbit P0_0=P0^0;//即定義P0_0為P0口的第1位,以便進行位操作。bit和int char之類的差不多,只不過char=8位, bit=1位而已。都是變數,編譯器在編譯過程中分配地址。除非你指定,否則這個地址是隨機的。這個地址是整個可定址空間,RAM+FLASH+擴展空間。bit只有0和1兩種值,意義有點像Windows下VC中的BOOL。
㈤ c語言中bit與sbit的區別
1. 在C語言中,"bit"和"sbit"的定義和使用場景存在顯著差異。
2. "bit"作為基本的數據單位,用於表示二進制位,其值只能是0或1。
3. "sbit"則主要用於嵌入式編程,表示特殊的位欄位,通常與硬體寄存器的特定位相關。
4. "bit"是計算機信息處理的基礎,是所有數據類型的組成部分。
5. "sbit"在嵌入式系統中用於表示硬體寄存器的特殊位,便於進行精確的操作。
6. 使用"sbit"可以方便地設置或清除特定的位標志,這些標志通常與硬體的狀態或功能直接相關。
7. 需要注意的是,並非所有編譯器都支持"sbit"關鍵字,這取決於具體的編譯器和編程環境。
8. 理解"bit"和"sbit"的區別,有助於在編程時更准確地使用它們。