最近在寫程式時,我需要判斷乙個dword 型別變數的某乙個二進位制位是否為1或0,
我們都很清楚,dword型別的變數在記憶體中佔32位,現在要我們判斷其中的某一位是0還是1,
該如何是好呢?這時我想到了c語言中的位操作,借助位操作,可以實現我們想要的功能。
關於位操作,我從網上收集整理的資料如下:
一、位的概念
我們知道,在計算機中,乙個位元組佔8位(現在的某些電腦也有佔16位的),
這樣表示的數的範圍為0-255,也即00000000-11111111。位就是裡面的0和1。
二、位邏輯運算子
符號 描述
& 位邏輯與
| 位邏輯或
^ 位邏輯異或
~ 取補(取反)
以上位運算子,除去最後乙個運算子是單目運算子,其他都是雙目運算子。
注:單目運算子只需要乙個運算元,雙目運算子必須要有兩個運算元才能進行運算
這些運算子只能用於整型表示式。
位邏輯運算子通常用於對整型變數進行位的設定、清零、取反、以及對某些選定的位進行檢測。
在程式中一般被程式設計師用來作為開關標誌。
較低層次的硬體裝置驅動程式,經常需要對輸入輸出裝置進行位操作。
三、位運算規則
&
運算的規則是當兩個位都為1時,結果為1,否則為0;
| 運算的規則是當兩個位都為0時,結果為0,否則為1;
^運算的規則是當兩個位相同時,結果為0,否則為1;
~運算的規則是當為1時結果為0,當為0時,結果為1。
應用舉例:
設定位:設定某位為1,而其他位保持不變,可以使用位邏輯或運算。
char c;
c=c|0x40;
這樣不論c原先是多少,和01000000或以後,總能使第6位為1,而其他位不變。
清除位:
設定某位為0,而其他位保持不變。可以使用位邏輯與運算。
c=c&0xbf;
這樣c和10111111與以後,總能使第6位為0,其他位保持不變。
那如果想讓某位為1,其他位都為0怎麼辦呢?
四、位移運算子
符號 描述
<<左移
>>右移
位移運算子作用於其左側的變數,其右側的表示式的值就是要移動的位數,運算結果就是移動後的數值。
例如:
b=a<<2; //就是a的值左移兩位並賦值為b,注意:a本身的值並沒有改變。
向左移位就是在低位插入0,
向右移位就是在高位上插入0。
右移時可以保持結果的符號位,
也就是右移時,如果最高位為1,是符號位,則補1而不是補0。
程式設計師常常用右移運算子來實現整數除法運算,
用左移運算子來實現整數乘法運算。其中用來實現乘法和除法的因子必須是2的n冪次。
學習C語言中的位操作
最近在寫程式時,我需要判斷乙個dword 型別變數的某乙個二進位制位是否為1或0,我們都很清楚,dword型別的變數在記憶體中佔32位,現在要我們判斷其中的某一位是0還是1,該如何是好呢?這時我想到了c語言中的位操作,借助位操作,可以實現我們想要的功能。關於位操作,我從網上收集整理的資料如下 一 位...
C語言中位操作
0 0 0 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 1 1 1 1.不改變其他位的值的狀況下,對某幾個位進行設值。先對需要設定的位用 操作符進行清零操作,然後用 操作符設值。比如我要改變 gpioa 的狀態,可以先對暫存器的值進行 清零操作 gpioa crl 0xf...
C語言中的位操作
目錄 1.前言 2.數值在計算機中的表示 3.位運算 4.位段 正文 1.前言 為了節省記憶體空間,在系統軟體中常將多個標誌狀態簡單地組合在一起,儲存到乙個位元組 或字 中。語言是為研製系統軟體而設計的,所以她提供了實現將標誌狀態從標誌位元組中分離出來的位運算功能。所謂位運算是指,按二進位制位進行的...