c語言二進位制數表示 C語言位操作

2021-10-12 03:50:08 字數 2606 閱讀 5171

了解位的基本概念

熟悉二進位制數的運算方法

掌握各種位運算的方法和技巧

熟悉位段的基本概念

掌握位段中資料的引用方法

掌握數值的轉換方法和技巧

c語言區別於其他語言的重要特點是支援位運算,使其能夠完成組合語言所能完成的大部分功能。在實際的程式設計中借助與位運算往往可以設計出簡潔的演算法,使程式簡化,並且獲得較高的效率。另外,某些對硬體進行控制的程式設計中,位運算也是必不可少的。

位運算應用於整型資料,即把整型資料看成是固定的二進位制序列,然後對這些二進位制序列進行按位運算。與其他的高階語言相比,位運算是c語言的特點之一,在實際應用中可逐步體會其優越性。

二進位制就是逢二進一,比如十進位制數3轉換為二進位制數11,十進位制數10轉換為二進位制數1010。要把二進位制數轉換為十進位制數,可以使二進位制數字的每一位對應乙個2的某次冪,然後累加求和。

我們把二進位制數中的每乙個二進位制數稱為位(bit,位元),每個0或1就是一位,位是資料儲存的最小單位。

通常,我們把一組4位二進位制數稱為半位元組(nibble),一組8位二進位制數稱為乙個位元組(byte)。通常把兩個或者4個位元組稱為乙個字(word),兩個字又稱之為乙個雙字(double word)。

為了簡單起見,這裡以乙個位元組為例,來說明無符號數和有符號數。需要注意的是:在microsoft visual c++ 6.0中,整型int用4個位元組32位表示乙個有符號整數。

位或運算子

按位異或運算子

按位取反運算子

左移運算子

右移運算

位復合賦值運算子

按位或運算是讓參與運算的兩個數對應的二進位制位分別相或。只要對應的兩個二進位制位有乙個為1,結果就為1;只有當對應的兩個二進位制位的數都為0時,該位的運算結果才為0.。

按位異或運算是讓參與運算的兩個數對應的二進位制位分別相異或,當兩個對應的二進位制位不同時,結果為1,兩個對應的二進位制位相同時,結果為0。

按位異或運算的主要應用:

1. 使特定位翻轉。

2. 與0按位異或,保留原值。

3. 交換兩個值,不需要臨時變數。

按位取反運算子為單目運算子,運算物件就置於運算子的右邊,具有右結合性。其功能是把運算物件的內容按位取反,即1變為0,將0變為1。例如~9的運算表示為:

~(00001001)

結果為:11110110

左移運算用來把「<

int  a=8,b;

b=a<<3;

用二進位制表示運算過程如下:

a:     00001000  (a=8)

b=<<3: 01000000  (b=64)

右移運算子用來把「>>」左邊的運算數的各二進位制位全部右移若干位,移動的位數由「>>」右邊的數字指定。右移時,低位移出的二進位制數捨棄,左端移入的二進位制數分兩種情況:對於無符號整數和正整數,高位補0,對於負整數,高位補1,這是因為負數在機器內均用補碼表示。

例如:int  a=15;

a>>2;

表示把00001111(十進位制15)右移2位後變為00000011(十進位制3)。

右移時要注意符號位,對於有符號的數,右移時符號位將一同移動。當為正數時(符號位為0),最高位補0;為負數時(符號位為1),最高位是補0還是補1取決於編譯系統的規定。有的系統移入0,有的系統移入1,移入0的稱為「邏輯右移」,即簡單右移。移入1的稱為「算術右移」。

位運算子與賦值運算子可以組成復合賦值運算子,如:

例如:a|=b相當於a=a|b,a>>=b相當於a=a>>b。

由前可知,位運算的物件可以是整型和字元型資料,當兩個運算數型別不同時位數也不同,此時,系統將自動進行處理:先將兩個運算數右端對齊,然後,再將位數短的乙個運算數往高位擴充,即:無符號數和正整數左側用0補全;負數左側用1補全,然後對位數相等的這兩個數,按位進行運算。

位段的定義

位段中資料的引用

位段定義的一般形式為:

struct 位段結構名

{位段列表};

其中「位段列表」的形式為:  型別說明符  位段名:位段長度

位段變數的說明與結構體變數說明的方式相同。可採用先定義後說明、同時定義說明或直接說明這三種方式。例如:

struct  dz

unsigned  a:3;

unsigned  b:2;

unsigned  c:2;

}data;

其中位段a佔3位,位段b佔2位,位段c佔2位。

位段中資料引用的一般形式:    位段變數.位段成員

例如:data.a=3;

說明:位段成員的型別只能是unsigned或int型別。

乙個位段必須儲存在同乙個儲存單元中,不能跨兩個單元。即如果乙個單元空間不能容納乙個位段,則該空間不用,而從下乙個單元起存放該位段。也可以有意使某位段從下一單元開始存放。

由於位段不允許跨兩個位元組,因此位域的長度不能大於乙個位元組的長度,也就是說不能超過8位二進位制位。

可以定義無名位段,這時它只用來作填充或調整位置,無名的位段是不能夠使用的。

位段的長度不能大於儲存單元的長度,也不能定義位段陣列。

位段可以用整型格式符輸出,也可以用%u、%o、%x等格式輸出。

位段可以在數值表示式中引用,它會被系統自動轉換為整型數。

C語言學習二進位制的表示示例

進製的表示示例 include int main void 八進位制的表示示例程式 include int main void float和double,預設的值為double型別 include int main void 字元示例 include int main void ascii不是乙個值...

C語言讀寫二進位製流

學習赫夫曼編碼,對於如何把二進位製流存入二進位制檔案或如何從二進位制檔案讀出二進位製流進行了研究,總結網上諸多大俠的片言隻語,實現了這一功能。宣告 本人只是在學習c語言,不能跟專業人士相提並論。原理是用一組掩碼與要讀出或寫入的字元進行位運算,逐個寫入或輸出二進位製碼流。原始碼 include def...

c語言 反轉二進位制數

1.編寫函式 unsigned int reverse bit unsigned int value 這個函式的返回值value的二進位制位模式從左到右翻轉後的值。如 在32位機器上25這個值包含下列各位 00000000000000000000000000011001 翻轉後 2550136832...