位运算02 - 零基础入门学习C语言65(完)
生活随笔
收集整理的這篇文章主要介紹了
位运算02 - 零基础入门学习C语言65(完)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第十二章:位運算02
?讓編程改變世界
Change the world by program
?
“取反”運算符(~)
~是一個單目(元)運算符,用來對一個二進制數按位取反,即將0變1,將1變0。 例如,~025是對八進制數25(即二進制數00010101)按位求反。 ? 例如: [caption id="attachment_216" align="aligncenter" width="300"] “取反”運算符[/caption] ?左移運算符(<<)
左移運算符是用來將一個數的各二進制 位全部左移若干位。 例如:a =<< 2 將a的二進制數左移2位,右邊補0。 若a=15,即二進制數00001111,左移2位得00111100,(十進制數60) 若高位左移后溢出,舍棄。 左移1位相當于該數乘以2,左移2位相當于該數乘以4,15<<2=60,即乘了4。 但此結論只適用于該數左移時被溢出舍棄的高位中不包含1的情況。 假設以一個字節(8位)存一個整數,若a為無符號整型變量,則a=64時,左移一位時溢出的是0,而左移2位時,溢出的高位中包含1。 ?右移運算符(>>)
右移運算符是a>>2表示將a的各二進制位右移2位,移到右端的低位被舍棄,對無符號數,高位補0。 例如:a=017時: a的值用二進制形式表示為00001111, 舍棄低2位11,得到 a >> 2 == 00000011 ? 右移一位相當于除以2 右移n位相當于除以2^n ? 在右移時,需要注意符號位問題: 對無符號數,右移時左邊高位移入0; 對于有符號的值,如果原來符號位為0(該數為正),則左邊也是移入0。 如果符號位原來為1(即負數), 則左邊移入0還是1,要取決于所用的計算機系統。有的系統移入0,有的系統移入1。 移入0的稱為“邏輯右移”, 即簡單右移;移入1的稱為“算術右移”。 ? 例:a的值是十進制數 -2: a == 1111 1110(用二進制形式表示) 無符號數:a>>1: 0111 1111 (邏輯右移時) 有符號數:a>>1: 1111 1111 (算術右移時) 光說不做不成,小甲魚帶大伙試驗下! 天下事有難易乎,為之,則難者亦易已;不為,則易者亦難已! ?位運算賦值運算符
位運算符與賦值運算符可以組成復合賦值運算符。 例如: &=, |=, >>=, <<=, ∧= ∴ a & = b 相當于 a = a & b a << =2 相當于 a = a << 2 ?位運算舉例
題目:取一個char a從右端開始的2~5位。 ? ① 先使a右移2位:a >> 2 目的是使要取出的那幾位移到最右端,圖示: ② 設置一個低4位全為1,其余全為0的數。 ~ ( ~ 0 << 4 ) ③ 將上面①、②進行&運算。 (a >> 4) & ~ ( ~ 0 << 4 ) ? 題目:要求將a進行右循環移位 ? [caption id="attachment_217" align="aligncenter" width="298"] 循環移位[/caption] ?位段
信息的存取一般以字節為單位。實際上,有時存儲一個信息不必用一個或多個字節。 例如,“真”或“假”用0或1表示,只需1位即可。 在計算機用于過程控制、參數檢測或數據通信領域時,控制信息往往只占一個字節中的一個或幾個二進制位,常常在一個字節中放幾個信息。 C語言允許在一個結構體中以位為單位來指定其成員所占內存長度,這種以位為單位的成員稱為“位段”或稱“位域” ( bit field) 。利用位段能夠用較少的位數存儲數據。 [codesyntax lang="c"] struct packed-data {unsigned a: 2;unsigned b: 6;unsigned c: 4;unsigned d: 4;int i; }data; [/codesyntax] ?關于位段的定義和引用的說明
(1) 位段成員的類型必須指定為unsigned或int類型。 (2) 若某一位段要從另一個字開始存放,可用以下形式定義: [codesyntax lang="c"] unsigned a:1; unsigned b:2; // 一個存儲單元 unsigned :0; unsigned c:3; // 另一存儲單元 [/codesyntax] a、b、c應連續存放在一個存儲單元中,由于用了長度為0的位段,其作用是使下一個位段從下一個存儲單元開始存放。因此,只將a、b存儲在一個存儲單元中,c另存在下一個單元(“存儲單元”可能是一個字節,也可能是2個字節,視不同的編譯系統而異)。 (3) 一個位段必須存儲在同一存儲單元中,不能跨兩個單元。如果第一個單元空間不能容納下一個位段,則該空間不用,而從下一個單元起存放該位段。 (4) 可以定義無名位段。 (5) 位段的長度不能大于存儲單元的長度,也不能定義位段數組。 (6) 位段可以用整型格式符輸出。 (7) 位段可以在數值表達式中引用,它會被系統自動地轉換成整型數。 [buy]?獲得所有教學視頻、課件、源代碼等資源打包?[/buy] [Downlink href='http://kuai.xunlei.com/d/LPOAFTTLMYRF']視頻下載[/Downlink]轉載于:https://www.cnblogs.com/LoveFishC/archive/2011/04/23/3847061.html
總結
以上是生活随笔為你收集整理的位运算02 - 零基础入门学习C语言65(完)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dp application in pa
- 下一篇: AllowOverride以及Optio