C 裡的有關位操作的方法總結

2021-08-21 18:01:35 字數 2478 閱讀 5983

有時候人就是這麼奇怪,受了天大的委屈都不會吭聲,但聽到安慰的話卻泣不成聲。那些硬生生憋回去的眼淚,往往會敗給一句簡單的安慰。

涉及到c/c++裡的位元組讀取、儲存問題~

在計算機系統中,資料儲存是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型,那麼,對於位數大於8位的處理器,例如16位或者32位的處理器,由於儲存位址的寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題,也就是說要把乙個16位或32位的整數分割成位二或四段分別進行儲存,而每一段的儲存位置就是位元組順序的差異。因此就導致了大端儲存模式和小端儲存模式。例如乙個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對於大端模式,就將0x11放在低位址中,即0x0010中,0x22放在高位址中,即0x0011中。小端模式,剛好相反。

舉例來說,假設有乙個int a=0x12345678,大小端區別見下表:

為了了解位操作

上面我們看了在計算機當中的位元組儲存問題

接下來重點說一說跟位操作相關、相似的位域、聯合體、memcpy,這三種操作對於某些實際問題可以通用,也可以結合使用,位域呢,是把乙個位元組劃分成幾個不同的區域,每個區域有乙個網域名稱,這樣就可以把不同的物件用同乙個位元組的二進位制位來表示;聯合體union呢,是共享記憶體的,即在共用體內的每個資料成員在記憶體中的位址是相同的,這樣你無論修改哪個變數,另乙個變數的值也會跟著改變;記憶體拷貝呢,是把size個位元組的資源記憶體(src所指向的記憶體區域) 拷貝到目標記憶體(dest所指向的記憶體區域),切記它是以位元組為單位開始拷貝的~

所謂」位域「是把乙個位元組中的二進位制位劃分為幾 個不同的區域, 並說明每個區域的位數。每個域有乙個網域名稱,允許在程式中按網域名稱進行操作,它實際上是c語言提供的一種資料結構。

使用位域的好處是:   

1.有些資訊在儲存時,並不需要占用乙個完整的位元組, 而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態, 用一位二進位即可。這樣節省儲存空間,而且處理簡便。 這樣就可以把幾個不同的物件用乙個位元組的二進位制位域來表示。

2.可以很方便的利用位域把乙個變數給按位分解。比如只需要4個大小在0到3的隨即數,就可以只rand()一次,然後每個位域取2個二進位制位即可,省時省空間。

struct 位域結構名 

;其中位域列表的形式為: 型別說明符 位網域名稱:位域長度;

例:struct

wy;這個位域定義的意思是,結構體內有四個變數x1,x2,x3,x4,每個變數佔2個二進位制位,那你猜猜這個結構體占大多空間呢?是1個位元組,因為共8個二進位制位,也就是1個位元組。這個可以自己sizeof()一下進行驗證。

union,中文名「聯合體、共用體」,在某種程度上類似結構體struct的一種資料結構,共用體(union)和結構體(struct)同樣可以包含很多種資料型別和變數。

不過區別也挺明顯:

結構體(struct)中所有變數是「共存」的——優點是「有容乃大」,全面;缺點是struct記憶體空間的分配是粗放的,不管用不用,全分配。

而聯合體(union)中是各變數是「互斥」的——缺點就是不夠「包容」;但優點是記憶體使用更為精細靈活,也節省了記憶體空間。

注意:聯合體(union)

裡不允許存放帶有建構函式、析夠函式、複製拷貝操作符等的類,因為他們共享記憶體,編譯器無法保證這些物件不被破壞,也無法保證離開時呼叫析夠函式。

#include

union var;

int main()

結果:01020304

證明我的32位linux是小端(little-endian)

同樣,要是反過來測試:

#include "stdio.h"

union var

cn;unsigned char s;

} tmp;

int main()

輸出的結果是2,3,2,2。

從這個結果我們就可以看出來,這個按位分解是從地位到高位的。對照表:

x4  x3  x2  x1

10 10  11  10

高位

void *memcpy(void *str1, const void *str2, size_t n)
例:

#include #include int main()

注意:

(1)memcpy可以拷貝任何型別的物件,因為函式的引數型別是void*(未定義型別指標),也就是說傳進去的實參可以是int*,short*,char*等等;

(2)但是由於函式拷貝的過程是乙個位元組乙個位元組的拷貝的,所以實際操作的時候要把void*強制轉化為char*,這樣在指標加的時候才會保證每次加乙個位元組,呵呵

ending ~

see you next ~

c語言位操作總結

置位 define bit3 0x1 3 static int a void set bit3 void void clear bit3 void 判斷位是否為1 if a bit3 nt a 1x x 0x1011 把第三位置0 define bitget number,pos number po...

C語言裡的位域

c語言裡的位域是 個比較複雜的問題,涉及的方面也比較多,關於位域的基礎內容可以參考以下文章 理解c語言位域 分析 如下 include stdio.h include memory.h typedef struct bitseg1bitseg1 typedef struct bitseg2bitse...

c 操作Access的方法總結

c 操作access的方法總結 建立mdb 建立table 讀取table內容 查詢table中的內容 向table中插入資料 刪除table中的記錄 向table中插入 讀取table中的 等。另 本人水平有限,不當之處還請斧正。廢話少說,開始正題。文介紹c 訪問操作access資料庫的基礎知識,...