...
Read more
2007年2月28日 星期三
2007年2月26日 星期一
[+/-] : motion JPEG vs MPEG 4
http://www.blueeyes.com.tw/whitepaper_7.php
在過去,Motion JPEG(以下簡稱MJPEG)與MPEG-4是兩種最常被大家討論與應用的壓縮技術,兩種技術各有其優缺點。
1、MJPEG
原理
MJPEG是一種基於靜態圖像壓縮技術JPEG演變而成的動態圖像壓縮技術。
MJPEG能生成序列化的運動圖像,過程中不考慮視訊流內不同畫面之間的變化,只單獨針對各畫面進行壓縮,此種壓縮方式非常適合靜態畫面,解析度可從352×240、704×480到1280x1024。
傳統JPEG壓縮技術是直接處理整個畫面,必需等到整個壓縮檔案傳輸完成才開始進行解壓縮成影像畫面,這樣的方式造成傳輸一個高解析畫面時須花費數十秒甚至數分鐘。
基本上,影像的播放只要能達到每秒鐘30個畫面,看起來就會平滑順暢。
優勢
新的MJPEG是採取漸層式傳輸技術,先傳輸低解析圖檔,然後再補送細部資料,使畫面品質改善到最佳。
MJPEG壓縮技術可以獲取清晰度非常高的影像,而且在每秒任何幅數下皆可任意自訂畫質與解析度。
因其壓縮後之格式可截取單一畫面,所以可以任意剪接。
MJPEG因採用畫面內壓縮方式也適用於視訊編輯。
因為MJPEG採用的是簡單壓縮動作,觀看端不需進行解壓縮,只需將串流視訊切割播放,所以並不會消耗太多硬體資源,可達到影像低延遲效果。
因MJPEG屬於開放格式,無版權費用問題,故開發與使用的廠商眾多。
缺點
相較其他壓縮格式,壓縮效率低是MJPEG的主要缺點(參見圖四),MJPEG演算法係根據每一畫面圖像的內容進行壓縮,而不是依據相鄰畫面圖像間的差異來進行壓縮,因此造成了大量冗餘資訊被重複存儲,沒有動作發生仍佔用頻寬,儲存佔用的空間大到每畫面8~15K位元組,最好的狀況也只能做到每畫面3K位元組,但如果因此而採用高壓縮比則視訊品質會嚴重降低。
此外,MJPEG並不支援語音同步傳輸。
2、MPEG-4
原理
根基於MPEG-1/MPEG-2壓縮技術,MPEG-4是專為行動通信設備(例如第三代行動通訊)在網際網路上進行即時傳輸音/視訊訊號而制定的最新MPEG標準。
特色為基於畫面重建演算法來壓縮和傳輸動作指令與資料,通過動態監測圖像每個區域的變化,按物件的空間和時間特徵來調整壓縮方法,從而可以獲得比MJPEG更大的壓縮比,並且在有限且低頻寬下有更佳的影像品質。
優勢
MPEG-4可使用現有的傳輸層標準,包含MPEG-2 Transport Stream傳輸,MPEG-4串流可經由現有的MPEG-2設備傳輸,使得MPEG-4在廣播市場上具備了更大的發展性;其次則為IP網路傳輸,MPEG-4串流可經由IP網路傳輸。
MPEG-4在壓縮技術上和前二代標準有很大的不同,MPEG-1 和 MPEG-2 壓縮原理是將視訊畫面切割為較小的塊狀單位,再就其重複的部分處理,而 MPEG-4 會將視訊畫面分析為前景、背景,只要記錄動態圖像的軌跡即可,因此在壓縮量及品質上,能較 MPEG-1 及 MPEG -2 來得更好,每秒動態資料處理速率彈性更大。
MPEG-4新增工具以增加程式運算效能,其高壓縮能力倍數為200倍(靜態圖像可達800倍),解析度可從320×240到1280×1024像素,應用目標係針對低頻寬傳輸、高畫質壓縮、互動式操作以及將自然物與人造物相融合的表達方式,同時MPEG-4所擁有的影像單元是依解碼端的能力而定,讓各種高影音產品的應用服務不受傳輸速率的影響,達到廣泛的適應性和可擴展性(參見圖五)。
缺點
由於MPEG-4演算法複雜,所以在某種程度上存在著影像干擾和畫面扭曲失真的情況。
再者,因為採用畫面間壓縮技術,當物體呈現運動狀態時,MPEG-4格式不會立即反應傳輸,從而延遲較MJPEG嚴重。
MJPEG最大問題是需要佔用較大的儲存空間和頻寬,但這種壓縮技術在DVR產業仍然是主流。而且隨著網路和電腦技術的發展,硬碟容量和網路頻寬尚在不斷增漲。如果容量和頻寬問題能得到解決,使用者便會將焦點放在影像的畫質,而MPEG壓縮技術方式在這一方面並不具優勢。
並且,MPEG壓縮技術所錄製的圖像目前在歐美市場尚不能作為可靠的法庭證據。
MPEG-4目前有非常多的版本與等級,任意兩個MPEG-4標準不一定可以相容,無形中增加了整合與開發上的成本,並且,壓縮與解壓縮過程都需要支付授權費用。...
Read more
在過去,Motion JPEG(以下簡稱MJPEG)與MPEG-4是兩種最常被大家討論與應用的壓縮技術,兩種技術各有其優缺點。
1、MJPEG
原理
MJPEG是一種基於靜態圖像壓縮技術JPEG演變而成的動態圖像壓縮技術。
MJPEG能生成序列化的運動圖像,過程中不考慮視訊流內不同畫面之間的變化,只單獨針對各畫面進行壓縮,此種壓縮方式非常適合靜態畫面,解析度可從352×240、704×480到1280x1024。
傳統JPEG壓縮技術是直接處理整個畫面,必需等到整個壓縮檔案傳輸完成才開始進行解壓縮成影像畫面,這樣的方式造成傳輸一個高解析畫面時須花費數十秒甚至數分鐘。
基本上,影像的播放只要能達到每秒鐘30個畫面,看起來就會平滑順暢。
優勢
新的MJPEG是採取漸層式傳輸技術,先傳輸低解析圖檔,然後再補送細部資料,使畫面品質改善到最佳。
MJPEG壓縮技術可以獲取清晰度非常高的影像,而且在每秒任何幅數下皆可任意自訂畫質與解析度。
因其壓縮後之格式可截取單一畫面,所以可以任意剪接。
MJPEG因採用畫面內壓縮方式也適用於視訊編輯。
因為MJPEG採用的是簡單壓縮動作,觀看端不需進行解壓縮,只需將串流視訊切割播放,所以並不會消耗太多硬體資源,可達到影像低延遲效果。
因MJPEG屬於開放格式,無版權費用問題,故開發與使用的廠商眾多。
缺點
相較其他壓縮格式,壓縮效率低是MJPEG的主要缺點(參見圖四),MJPEG演算法係根據每一畫面圖像的內容進行壓縮,而不是依據相鄰畫面圖像間的差異來進行壓縮,因此造成了大量冗餘資訊被重複存儲,沒有動作發生仍佔用頻寬,儲存佔用的空間大到每畫面8~15K位元組,最好的狀況也只能做到每畫面3K位元組,但如果因此而採用高壓縮比則視訊品質會嚴重降低。
此外,MJPEG並不支援語音同步傳輸。
2、MPEG-4
原理
根基於MPEG-1/MPEG-2壓縮技術,MPEG-4是專為行動通信設備(例如第三代行動通訊)在網際網路上進行即時傳輸音/視訊訊號而制定的最新MPEG標準。
特色為基於畫面重建演算法來壓縮和傳輸動作指令與資料,通過動態監測圖像每個區域的變化,按物件的空間和時間特徵來調整壓縮方法,從而可以獲得比MJPEG更大的壓縮比,並且在有限且低頻寬下有更佳的影像品質。
優勢
MPEG-4可使用現有的傳輸層標準,包含MPEG-2 Transport Stream傳輸,MPEG-4串流可經由現有的MPEG-2設備傳輸,使得MPEG-4在廣播市場上具備了更大的發展性;其次則為IP網路傳輸,MPEG-4串流可經由IP網路傳輸。
MPEG-4在壓縮技術上和前二代標準有很大的不同,MPEG-1 和 MPEG-2 壓縮原理是將視訊畫面切割為較小的塊狀單位,再就其重複的部分處理,而 MPEG-4 會將視訊畫面分析為前景、背景,只要記錄動態圖像的軌跡即可,因此在壓縮量及品質上,能較 MPEG-1 及 MPEG -2 來得更好,每秒動態資料處理速率彈性更大。
MPEG-4新增工具以增加程式運算效能,其高壓縮能力倍數為200倍(靜態圖像可達800倍),解析度可從320×240到1280×1024像素,應用目標係針對低頻寬傳輸、高畫質壓縮、互動式操作以及將自然物與人造物相融合的表達方式,同時MPEG-4所擁有的影像單元是依解碼端的能力而定,讓各種高影音產品的應用服務不受傳輸速率的影響,達到廣泛的適應性和可擴展性(參見圖五)。
缺點
由於MPEG-4演算法複雜,所以在某種程度上存在著影像干擾和畫面扭曲失真的情況。
再者,因為採用畫面間壓縮技術,當物體呈現運動狀態時,MPEG-4格式不會立即反應傳輸,從而延遲較MJPEG嚴重。
MJPEG最大問題是需要佔用較大的儲存空間和頻寬,但這種壓縮技術在DVR產業仍然是主流。而且隨著網路和電腦技術的發展,硬碟容量和網路頻寬尚在不斷增漲。如果容量和頻寬問題能得到解決,使用者便會將焦點放在影像的畫質,而MPEG壓縮技術方式在這一方面並不具優勢。
並且,MPEG壓縮技術所錄製的圖像目前在歐美市場尚不能作為可靠的法庭證據。
MPEG-4目前有非常多的版本與等級,任意兩個MPEG-4標準不一定可以相容,無形中增加了整合與開發上的成本,並且,壓縮與解壓縮過程都需要支付授權費用。...
Read more
[+/-] : SRAM
SRAM
由六個電晶體組成的SRAM記憶單元靜態隨機存取記憶體(Static Random Access Memory,SRAM)是半導體記憶體的一種,屬隨機存取記憶體(RAM)一類。
所謂的「靜態」,是指這種記憶體只要保持通電,裡面儲存的資訊就可以恆常保持。相對之下,動態隨機存取記憶體(DRAM)裡面所儲存的資料就需要週期性地更新。
然而,當電力供應停止時,其內儲存的資料還是會消失,這與在斷電後還能儲存資料的ROM或快閃記憶體仍然是不同的。
與DRAM之比較
在同樣的運作頻率下,由於SRAM對稱的電路結構設計,使得每個記憶單元內所儲存的數值都能以比DRAM快的速率被讀取。除此之外,由於SRAM通常都被設計成一次就讀取所有的資料位元(Bit),比起高低位址的資料交互讀取的DRAM,在讀取效率上也快上很多。因此雖然SRAM的生產成本比較高,但在需要高速讀寫資料的地方,如電腦上的快取(Cache),還是會使用SRAM而非DRAM。
[ 參考 ]
http://zh.wikipedia.org/wiki/SRAM...
Read more
由六個電晶體組成的SRAM記憶單元靜態隨機存取記憶體(Static Random Access Memory,SRAM)是半導體記憶體的一種,屬隨機存取記憶體(RAM)一類。
所謂的「靜態」,是指這種記憶體只要保持通電,裡面儲存的資訊就可以恆常保持。相對之下,動態隨機存取記憶體(DRAM)裡面所儲存的資料就需要週期性地更新。
然而,當電力供應停止時,其內儲存的資料還是會消失,這與在斷電後還能儲存資料的ROM或快閃記憶體仍然是不同的。
與DRAM之比較
在同樣的運作頻率下,由於SRAM對稱的電路結構設計,使得每個記憶單元內所儲存的數值都能以比DRAM快的速率被讀取。除此之外,由於SRAM通常都被設計成一次就讀取所有的資料位元(Bit),比起高低位址的資料交互讀取的DRAM,在讀取效率上也快上很多。因此雖然SRAM的生產成本比較高,但在需要高速讀寫資料的地方,如電腦上的快取(Cache),還是會使用SRAM而非DRAM。
[ 參考 ]
http://zh.wikipedia.org/wiki/SRAM...
Read more
[+/-] : Little endien
依照 CPU 設計的不同, 當資料寬度超過一個位元組 (BYTE) 以上時, 將高位元組擺在前面稱為 BIG-ENDIAN, 相反的方式稱為 LITTLE-ENDIAN.
HP, IBM, MOTOROLA 68K 系列使用 BIG-ENDIAN 設計.INTEL X86, DEC VAX 使用 LITTLE-ENDIAN 設計.POWERPC 支援兩種格式, 稱為 BI-ENDIAN.
例子1:
例如 "ECHO" 在 LITTLE-ENDIAN 系統使用兩組兩個位元組 (WORDS) 來儲存字串時, 記憶體內排列應該是 "CEOH",
在 BIG-ENDIAN 系統則是 "ECHO".
例子2:
如果你在文件上看到一個雙字組的data, Ex: long MyData=0x11223344
1. 如果是Big Endian的系統, 存到記憶體會變成
0x11 0x22 0x33 0x44
2. 如果是Little Endian的系統, 存到記憶體會變成
0x44 0x33 0x22 0x11
參考:
http://www.taiwan.cnet.com/enterprise/glossary/term/0,2000062921,2000051373,00.htm
http://delphi.ktop.com.tw/board.php?cid=32&fid=107&tid=29224...
Read more
HP, IBM, MOTOROLA 68K 系列使用 BIG-ENDIAN 設計.INTEL X86, DEC VAX 使用 LITTLE-ENDIAN 設計.POWERPC 支援兩種格式, 稱為 BI-ENDIAN.
例子1:
例如 "ECHO" 在 LITTLE-ENDIAN 系統使用兩組兩個位元組 (WORDS) 來儲存字串時, 記憶體內排列應該是 "CEOH",
在 BIG-ENDIAN 系統則是 "ECHO".
例子2:
如果你在文件上看到一個雙字組的data, Ex: long MyData=0x11223344
1. 如果是Big Endian的系統, 存到記憶體會變成
0x11 0x22 0x33 0x44
2. 如果是Little Endian的系統, 存到記憶體會變成
0x44 0x33 0x22 0x11
參考:
http://www.taiwan.cnet.com/enterprise/glossary/term/0,2000062921,2000051373,00.htm
http://delphi.ktop.com.tw/board.php?cid=32&fid=107&tid=29224...
Read more
[+/-] : typedef
typedef
1.
將資料型態定義成自己希望的識別字,方便撰寫程式.
比方說
typedef int number; // 表示number識別字和int相同.
int n; // 宣告一個int變數n.
number n; // 宣告一個number變數n,而number其實就是int.
又比方說有一個結構叫做record
struct record
{
int number;
struct record *next;
}
typedef struct record Node; // 表示Node識別字和struct record相同.
struct record record1; // 宣告一個record結構名為record1.
Node record1; // 宣告一個Node 結構名為record1,而Node 其實就是 struct record的意思.
除了省下了打字的力氣以外,由於不同的機器使用的資料型態都不太一樣,換機器跑程式時,只要修改typedef就好了,增加了C的可攜性.
[ 參考 ] http://home.educities.edu.tw/peterhuang1/Clan/CLanTypedef.htm
2.
struct t_Point
{
int x; int y;
}; // 注意,這裡最後一個分號不能省略
int main(int argc, char* argv[])
{
struct t_Point a, b;
// . . .
return 0;
}
顯然,這種方法沒有typedef更加直觀(在C++中,main函數第一行的struct關鍵字可以省略,但在標準C中,省略該關鍵字會出現編譯錯誤)。
此外,對於定義鏈接隊列中的結點,我們可以這樣實現:
typedef struct t_node
{
int Value;
struct t_node *next;
} Node;
當然也可以這樣定義:
typedef strcut t_node Node;
struct t_node
{
int Value;
Node *next;
};
[ 參考 ]
http://blog.csdn.net/acqy/archive/2004/10/10/130293.aspx...
Read more
1.
將資料型態定義成自己希望的識別字,方便撰寫程式.
比方說
typedef int number; // 表示number識別字和int相同.
int n; // 宣告一個int變數n.
number n; // 宣告一個number變數n,而number其實就是int.
又比方說有一個結構叫做record
struct record
{
int number;
struct record *next;
}
typedef struct record Node; // 表示Node識別字和struct record相同.
struct record record1; // 宣告一個record結構名為record1.
Node record1; // 宣告一個Node 結構名為record1,而Node 其實就是 struct record的意思.
除了省下了打字的力氣以外,由於不同的機器使用的資料型態都不太一樣,換機器跑程式時,只要修改typedef就好了,增加了C的可攜性.
[ 參考 ] http://home.educities.edu.tw/peterhuang1/Clan/CLanTypedef.htm
2.
struct t_Point
{
int x; int y;
}; // 注意,這裡最後一個分號不能省略
int main(int argc, char* argv[])
{
struct t_Point a, b;
// . . .
return 0;
}
顯然,這種方法沒有typedef更加直觀(在C++中,main函數第一行的struct關鍵字可以省略,但在標準C中,省略該關鍵字會出現編譯錯誤)。
此外,對於定義鏈接隊列中的結點,我們可以這樣實現:
typedef struct t_node
{
int Value;
struct t_node *next;
} Node;
當然也可以這樣定義:
typedef strcut t_node Node;
struct t_node
{
int Value;
Node *next;
};
[ 參考 ]
http://blog.csdn.net/acqy/archive/2004/10/10/130293.aspx...
Read more
[+/-] : xdata and data
[ 例 ]
char xdata* data pagePointer = 0x1000;
拆開來看, 把 KEIL 擴充的先拿掉;
char * pagePointer; // 指向字元的指標
加入 xdata, 描述指標形式, char xdata * pagePointer; // 被指向字元位於外部記憶體
加入 data, 描述 pagePointer 本體所在位置, char xdata * data pagePointer; // 被指向字元位於外部記憶體, pagePointer 本體配置於晶片內記憶體.
加入初值 char xdata* data pagePointer = 0x1000; // pagePointer 指向外部記憶體位址 0x1000 的字元.
有關於KEIL C裡面一些東西,如果你不太清楚的話,你可以去找一下KEIL C COMPILER的使用說明,裡面有很詳盡的解說,比市面上一般書籍介紹的還要多,看完後你就會很瞭解的。
[ 轉錄 ]
http://www.haifeng.idv.tw/leo/cgi-bin/topic.cgi?forum=53&topic=167&show=20...
Read more
char xdata* data pagePointer = 0x1000;
拆開來看, 把 KEIL 擴充的先拿掉;
char * pagePointer; // 指向字元的指標
加入 xdata, 描述指標形式, char xdata * pagePointer; // 被指向字元位於外部記憶體
加入 data, 描述 pagePointer 本體所在位置, char xdata * data pagePointer; // 被指向字元位於外部記憶體, pagePointer 本體配置於晶片內記憶體.
加入初值 char xdata* data pagePointer = 0x1000; // pagePointer 指向外部記憶體位址 0x1000 的字元.
有關於KEIL C裡面一些東西,如果你不太清楚的話,你可以去找一下KEIL C COMPILER的使用說明,裡面有很詳盡的解說,比市面上一般書籍介紹的還要多,看完後你就會很瞭解的。
[ 轉錄 ]
http://www.haifeng.idv.tw/leo/cgi-bin/topic.cgi?forum=53&topic=167&show=20...
Read more
[+/-] : volatile
volatile宣告 在C裡面有volatile這個宣告,通常是說這個變數會被外在routine改變, 在kernel裡面通常是指會被interrupt handler(有時就是硬體中斷的routine) 改變值,也就是被非同步的改變的變數。例如 unsigned long vloatile jiffies; jiffies在kernel是時間每次hardware的中斷會來改這個值 在asm裡面是說這個東西compiler時,gcc不要雞婆作optimized,因為 最佳化的結果,compiler會把code按照他想的方法放到記憶體裡, 但是有的code我們需要特定指定他一定要在某個記憶體上, 在kernel裡常有這樣情形發生,我們可以用 __asm__ __volatile__宣告一段assembly的code是不要做最佳化的。 例如cli sti #define disable() __asm__ __volatile__ ("cli"); #define enable() __asm__ __volatile__ ("sti");
[ 例1 ]
Volatile這玩意兒用在單晶片的C語言較多
例如:
Volatile char wait;
void xxx(void)
{
wait=1;
while (wait!=0);
.....
.....
}
void timer0(void) interrupt 1
{
wait=0;
.......
}
xxx()中就是等一個timer中斷才執底下工作.
如果不寫Volatile會被編譯器省略掉.
因為wait=1;何來wait會等於0
[ 例2 ]
volatile sig_atomic_t read_flag = 1;
volatile是一個關鍵字(keyword),用來修飾詞資料型態,與const有對應的關係。
是語言關鍵字的話,就不會出現在標頭檔內的定義。
volatile sig_atomic_t read_flag = 1;
read_flag是一個為sig_atomic_t的資料型態,透過volatile的修飾,說明sig_atomic_t在程式中,可以在任何的時間下被修改 ,
也就是說,你的程式可能同一時間不止一個程序在使用。
可能主程式main在使用的同時,I/O Device或另一個thread也在利用或指定這個read_flag
來透過溝通的作用。
[ 例3 ]
http://www.programmersheaven.com/articles/pathak/article1.htm
[ 參考 ]
http://www.programmersheaven.com/articles/pathak/article1.htm
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060329085552QSX&fumcde=FUM20050124191259IGD&rplcnt=5...
Read more
[ 例1 ]
Volatile這玩意兒用在單晶片的C語言較多
例如:
Volatile char wait;
void xxx(void)
{
wait=1;
while (wait!=0);
.....
.....
}
void timer0(void) interrupt 1
{
wait=0;
.......
}
xxx()中就是等一個timer中斷才執底下工作.
如果不寫Volatile會被編譯器省略掉.
因為wait=1;何來wait會等於0
[ 例2 ]
volatile sig_atomic_t read_flag = 1;
volatile是一個關鍵字(keyword),用來修飾詞資料型態,與const有對應的關係。
是語言關鍵字的話,就不會出現在標頭檔內的定義。
volatile sig_atomic_t read_flag = 1;
read_flag是一個為sig_atomic_t的資料型態,透過volatile的修飾,說明sig_atomic_t在程式中,可以在任何的時間下被修改 ,
也就是說,你的程式可能同一時間不止一個程序在使用。
可能主程式main在使用的同時,I/O Device或另一個thread也在利用或指定這個read_flag
來透過溝通的作用。
[ 例3 ]
http://www.programmersheaven.com/articles/pathak/article1.htm
[ 參考 ]
http://www.programmersheaven.com/articles/pathak/article1.htm
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060329085552QSX&fumcde=FUM20050124191259IGD&rplcnt=5...
Read more
2007年2月25日 星期日
[+/-] : 結構中的冒號; 位域
位域
有些信息在存儲時,並不需要佔用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個字節中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。一、位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變量的說明與結構變量說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
說明data為bs變量,共佔兩個字節。其中位域a占8位,位域b占2位,位域c占6位。對於位域的定義尚有以下幾點說明:
1. 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
}
在這個位域定義中,a佔第一字節的4位,後4位填0表示不使用,b從第二字節開始,佔用4位,c佔用4位。
2. 由於位域不允許跨兩個字節,因此位域的長度不能大於一個字節的長度,也就是說不能超過8位二進位。
3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。
二、位域的使用
位域的使用和結構成員的使用相同,其一般形式為: 位域變量名·位域名 位域允許用各種格式輸出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*PBit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
PBit=&bit;
PBit->a=0;
PBit->b&=3;
PBit->c=1;
printf("%d,%d,%d\n",PBit->a,PBit->b,PBit->c);
}
上例程序中定義了位域結構bs,三個位域為a,b,c。說明了bs類型的變量bit和指向bs類型的指針變量PBit。這表示位域也是可以使用指標的。
程序的9、10、11三行分別給三個位域賦值。( 應注意賦值不能超過該位域的允許範圍)程序第12行以整型量格式輸出三個域的內容。第13行把位域變量bit的地址送給指針變量PBit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復合的位運算符"&=", 該行相當於: PBit->b=PBit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進制值為3)。同樣,程序第16行中使用了復合位運算"=", 相當於: PBit->c=PBit->c1其結果為15。程序第17行用指針方式輸出了這三個域的值。
[ 參考 ]
http://big5.yesky.com/b5/dev.yesky.com/374/2645874.shtml...
Read more
有些信息在存儲時,並不需要佔用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個字節中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。一、位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變量的說明與結構變量說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
說明data為bs變量,共佔兩個字節。其中位域a占8位,位域b占2位,位域c占6位。對於位域的定義尚有以下幾點說明:
1. 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
}
在這個位域定義中,a佔第一字節的4位,後4位填0表示不使用,b從第二字節開始,佔用4位,c佔用4位。
2. 由於位域不允許跨兩個字節,因此位域的長度不能大於一個字節的長度,也就是說不能超過8位二進位。
3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。
二、位域的使用
位域的使用和結構成員的使用相同,其一般形式為: 位域變量名·位域名 位域允許用各種格式輸出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*PBit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
PBit=&bit;
PBit->a=0;
PBit->b&=3;
PBit->c=1;
printf("%d,%d,%d\n",PBit->a,PBit->b,PBit->c);
}
上例程序中定義了位域結構bs,三個位域為a,b,c。說明了bs類型的變量bit和指向bs類型的指針變量PBit。這表示位域也是可以使用指標的。
程序的9、10、11三行分別給三個位域賦值。( 應注意賦值不能超過該位域的允許範圍)程序第12行以整型量格式輸出三個域的內容。第13行把位域變量bit的地址送給指針變量PBit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復合的位運算符"&=", 該行相當於: PBit->b=PBit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進制值為3)。同樣,程序第16行中使用了復合位運算"=", 相當於: PBit->c=PBit->c1其結果為15。程序第17行用指針方式輸出了這三個域的值。
[ 參考 ]
http://big5.yesky.com/b5/dev.yesky.com/374/2645874.shtml...
Read more
[+/-] : pc camera 架構
[+/-] : 50個數碼相機名詞解釋(上)
[ Q ]
使用AE鎖有幾點需要注意:1、手動方式或自拍時不能使用自動曝光(AE)鎖。 2、按下自動曝光(AE)鎖之後不要再調節光圈大小。 3、用閃光燈攝影時不要使用(AE)鎖。
[ 參考 ]
50個數碼相機名詞解釋(上)
...
Read more
使用AE鎖有幾點需要注意:1、手動方式或自拍時不能使用自動曝光(AE)鎖。 2、按下自動曝光(AE)鎖之後不要再調節光圈大小。 3、用閃光燈攝影時不要使用(AE)鎖。
[ 參考 ]
50個數碼相機名詞解釋(上)
...
Read more
2007年2月5日 星期一
[+/-] : YUY2
YUV 格式通常有兩大類:打包(packed)格式和平面(planar)格式。
前者將 YUV 份量存放在同一個數組中,通常是幾個相鄰的像素組成一個宏像素(macro-pixel);而後者使用三個數組分開存放 YUV 三個份量,就像是一個三維平面一樣。
YUY2屬於packed格式:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directshow/htm/yuvvideosubtypes.asp ...
Read more
前者將 YUV 份量存放在同一個數組中,通常是幾個相鄰的像素組成一個宏像素(macro-pixel);而後者使用三個數組分開存放 YUV 三個份量,就像是一個三維平面一樣。
YUY2屬於packed格式:
[ 參考 ]
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directshow/htm/yuvvideosubtypes.asp
Read more
訂閱:
文章 (Atom)