您好,登錄后才能下訂單哦!
小編給大家分享一下C語言之位操作的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在C語言中,是可以單獨操控變量中的位的。因為C在提供高級語言便利的同時,還能在為匯編語言所保留的級別上工作。
在我們日常生活中通常使用的十進制。
例如數字1234可以寫成:
1 *10e3 + 2 * 10e2 + 3 * 10e1 + 4 * 10e0
這種方法是基于10的冪,所以稱為以10為基底書寫的。
那么以2為基底表示的數字就是二進制數。
例如:二進制數1111
1 * 2e3 + 1 * 2e2 + 1 * 2e1 + 1 * 2
轉換成十進制就是:
1* 8+1* 4+1*2+1 = 15
C語言用字節表示存儲系統字符集所需的大小,通常1字節為8位。
可以從左往右給這8位分別編號 7~0。在一字節中,編號是7的位被稱為高階位,編號為0的被稱為低階位,每一位的編號對應2的相應指數。
該字節能表示的最大的數字是把所有位設置為1:1111 1111,其值為255。最小值就是:0000 0000,其值為0。
所以1字節可以存儲0~255范圍內的數字總共256個值,在ASCII碼中對應了256個狀態。
unsigned char用1字節表示的范圍是0~255,而signed char 用1字節表示范圍是-128 ~ 127。
表示有符號數最簡單的方式是用1位(高階位)存儲符號,剩下7位表示數字。
用這種符號量表示法,1000 0001表示 -1、0000 0001表示 1。其表示范圍是 -127~127。這種方法的缺點是有兩個0,+0和-0,有點浪費。
二進制補碼方法避免了這個問題。以一字節為例:
二進制補碼用1字節中的后7位表示0~127,高階位設置為0.如果高階位是1,表示的是負數。 假設一個值位組合為:1000 0000,無符號字節就表示的128,有符號字節表示-128。
要得到一個二進制補碼的數的相反數,最簡單的方法是反轉每一位,然后加1。
1是0000 0001,-1就是 1111 1110 + 1,或 1111 1111。
一個普通的十進制浮點數可以這樣表示
0.234 = 2 /10 + 3 / 100 + 4 / 1000
從左往右各分母都是10的遞增次冪。
那么在二進制浮點數中,使用2的冪作為分母,比如
.1011 = 1 / 2 + 0 / 4 + 1 / 8 + 1 / 16
八進制以8為基底,用0~7表示數字。十六進制以16作為基底,用0 ~15表示數字。但沒有單獨的數表示10 ~ 15,所以用字母 A ~F表示。
3位二進制對應一位八進制
4位二進制對應一位十六進制
C提供了按位邏輯運算符和移位運算符。
4個按位邏輯運算符都用于整形數據,包括char。
一元運算符把1變為0,把0變為1。示例:
~(0001 1100) //表達式 (1110 0011) // 結果值
需要注意的是該運算符不會改變之前變量的值,但確實創建了一個可以使用或賦值的新值。
二元運算符通過逐位比較兩個運算對象生成一個新值。
對于每一個位,兩個運算對象中相應的位都為1時,結果為1。示例:
(1001 1001) & (0011 1100) //結果為 (0001 1000)
C有按位與和賦值結合的運算符:&=
val &= 0247 等價于 val = val & 0247
二元運算符|,對于每個位,如果兩個運算對象中相應的位是1,結果為1。
示例:
(1001 1001) | (0111 0010) 結果為 (1111 1011)
同時C也有這樣的運算符:|=
二元運算符 ^,對于每一位,如果兩個運算對象中相應的位一個為1,但不是兩個為1,結果為1。
示例:
(1100 0001) ^ (0101 1011) 結果為 (1001 1010)
同時C也有這樣的運算符: ^=
所謂掩碼指的是一些設置為開(1)或關(0)的位組合。
假設定義符號常量MASK為2,即(0000 0010),那么語句
val &= MASK
就是把val中除了1號位以外的所有位都設置為01號位的值不變。這個過程叫做使用掩碼,掩碼中的0隱藏了val中的其他位。
圖解:
有時需要打開一個值中的特定位,而其他位保持不變。
val |= MASK;
把val的1號位設置為1,其他位不變。
因為|運算符,任何位與0組合結果為本身,任何位與1組合,結果都為1。
和打開類似,有時需要再不影響其他位的情況下關閉指定的位。
假設要關閉變量val中的1號位,MASK只有1號位為1。即:
val = val & ~MASK;
由于MASK除1號位以外全為0,那~MASK除1號位以外全為1。再使用&,任何位與1組合都為本身,所以這條語句保持除1號位以外其他各位不變。
示例:
val ^= MASK; (0000 1111) ^ (1011 0110) 結果為 (10111001)
是指打開已關閉的位,或關閉已打開的位。可以使用按位異或運算符(^)切換位。
if ((val & MASK) == MASK) printf("...");
val中與MASK為1的位相對應的位都被切換了,MASK為0的位相對應的位不變。
若檢查val的某一位是否為1,可設置一個掩碼剛好這個位為1.
若檢查第二位,即:
MASK為(0000 0010)
程序可以這樣寫:
if ((val & MASK) == MASK) printf("...");
為了避免信息漏過邊界,掩碼至少要與其覆蓋的值寬度相同。
左移運算符將其左側運算對象每一位的值向左移動其右側運算對象指定的位數。左側運算對象移出左末端位的值丟失,用0填充空出的位置。
示例:
(1000 0110) << 2 結果為 (0001 1000)
可以使用左移賦值運算符(<<=)來更改變量的值。
int val = 1; //0000 0001 val <<= 2; 結果為 0000 0100
右移運算符將其左側運算對象每一位的值向右移動其右側運算對象指定的位數。
對于無符號類型,用0填充空出的位置,對于有符號類型,結果取決于機器。
示例:>>=
int val = 16; //0001 0000 val >>= 3; 結果為: 0000 0010
以上是“C語言之位操作的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。