動手學習C語言-硬件底層操作位運算


位運算是按照二進制位進行底層運算的操作;利用C語言來完成硬件的底層操作;

位運算及位運算符

一個字節 由八個 二進制位組成;字節的最右邊一位爲最低位,最左邊一位爲最高位;

與運算

// 編寫程序,按位運算求“與”運算結果,驗證十六進制9A6E8957和FF按照“與”運算的 結果

#include "stdio.h"
void main(){
	long int a,b,c; // long int has 4 bytes?
	a=6;
	b=5;
	c=a&b;// one & represents wei operation

	printf("a=%d,b=%d,c=%d\n",a,b,c);

	a=0x9A6E8957;
	b=0xff;
	c=a&b; // sixteen yunsuan
	printf("sixteen jinzhi:\n");
	printf("a=%x,b=%x,c=%x\n",a,b,c);

}

或運算,異或運算,按位取反運算,位移運算;

*** 位移運算,移出即溢出**
複合賦值運算符,即與“=”組成一塊;
需要掌握:數據正數和負數的原碼,反碼和補碼是如何表示的;

位段的結構體定義

位段定義的一般形式爲:
struct 位段結構名{
類型說明符 位段名1:位段長度
類型說明符 位段名2:位段長度
類型說明符 位段名3:位段長度

類型說明符 位段名n: 位段長度
};
結構體成員必須定義爲unsigned或者int 型;

位段的引用

使用位段結構體變量名引用位段成員
一般引用形式爲:
位段結構體變量名.位段名
**若是使用指向位段結構體變量的指針,引用位段成員則使用分量運算符“->”,引用位段結構體變量的位段成員;

// 位段結構體的定義與引用

include "stdio.h"
void main(){
	struct cell{
		unsigned int a:2; //長度兩個二進制位
		unsigned int b:1;
		unsigned int :5;  // 無名位段5位不用
		unsigned int c:4;

	}bits,*pb;
	//賦值給各位段最大值
	bits.a=3;    // 對應轉換成二進制
	bits.b=1;
	bits.c=15;

	printf("Decimal: a=%d,b=%d,c=%d\n",bits.a,bits.b,bits.c);
	printf("Hexadecimal: a=%x,b=%x,c=%x\n",bits.a,bits.b,bits.c);

	pb=&bits;// 結構體變量首地址賦值給pb
	// 給各位段賦值超出位段長度最大值的數
	pb->a=6;
	pb->b=2;
	pb->c=16;
	printf("Decimal: a=%d,b=%d,c=%d\n",pb->a,pb->b,pb->c);
	printf("Hexadecimal: a=%x,b=%x,c=%x\n",pb->a,pb->b,pb->c);
	
}

掌握:位段是如何定義和使用的;
如何處理一個位段跨長度字節的問題;
使用指向位段結構體變量的指針操作,指向和引用位段成員;

位運算的實際案例

// 編寫程序,一個數的二進制碼取出字右0位端開始的3-6位二進制數據

程序源碼:按照上述的算法編寫下面程序

// 編寫程序,一個數的二進制碼取出字右0位端開始的3-6位二進制數據

void main(){
	unsigned int a=0x6A,b=0,c;  // get the answer to a;
	a>>3;     // 使之在右對齊
	b=~((~b)<<4); // 這個是得到最右邊全是1
	c=a&b; // 即求位“與”運算

	printf("a=%d,b=%d,c=%d\n",a,b,c);
	printf("a=%x,b=%x,c=%x\n",a,b,c);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章