??位串
所謂位串就是由0和1組成的bit串呻此,比如:010010110011101101101011
宿百〕孟桑可以把位串看成是元素只有0和1組成的數組。一般情況下大量數據的標志位采用位串進行存儲這樣有利于存儲空間的節(jié)省垦页,比如磁盤中分配的記錄塊的空閑標志或者讀寫標志等雀费。位串的索引是從右往左從0開始計數。
功能:
系統提供了一套對位串進行0痊焊,1設置和0盏袄,1判斷的函數,用于對位串進行處理薄啥。系統提供的API函數都是以宏的形式提供的辕羽。
頭文件: #include <bitstring.h>
平臺: BSD Unix
一、位串的創(chuàng)建
功能: 用于創(chuàng)建一個位串對象垄惧,你可以從堆內存中創(chuàng)建也可以從棧內存中創(chuàng)建刁愿,位串的數據類型是bitstr_t
函數簽名:
//從堆內存中創(chuàng)建位串
bitstr_t * bit_alloc(int nbits);
//從棧內存中聲明一個位串
bit_decl(bitstr_t *name, int nbits);
//返回某個長度的位串需要占用的字節(jié)數量。
int bitstr_size(int nbits);
參數:
nbits: [in] 指定位串的長度赘艳。
name: [in] 主要用于棧內存上分配位串酌毡,指定位串變量的名稱
return:[out] 函數返回一個位串對象的指針。
描述:
用于建立一個位串對象蕾管,系統提供兩種方法:堆內存分配和棧內存分配枷踏,堆內存內部通過calloc進行分配,因此不使用時需要free掉掰曾,而棧內存則不需要釋放處理旭蠕。
示例代碼:
bitstr_t *p1 = bit_alloc(20); //從堆中分配20個長度的位串對象.
bitstr_t bit_decl(p2, 30); //從棧內存中分配30個長度的位串對象.
//.....
free(p1);
二、位串的設置
功能:用于設置位串中某一位或者某一個區(qū)域的位的值,可設置的值只能為1或者0.
函數簽名:
//將指定位置或者指定區(qū)域的值設置為1
bit_set(bitstr_t *name, int bit);
bit_nset(bitstr_t *name, int start, int stop);
//將指定位置或者指定區(qū)域的值設置為0
bit_clear(bitstr_t *name, int bit);
bit_nclear(bitstr_t *name, int start, int stop);
參數:
name:[in] 位串變量
bit掏熬、start佑稠、stop:[in] 位串的位置索引
描述:
用于將位串中指定位置的值設置為1或者0,位串的索引位置是從0開始的旗芬,并且是從右往左進行遞增的舌胶,注意的是這個索引位置不能超過位串的長度。
三疮丛、位串的測試
功能:用來判斷位串中某個位置的值是0還是1幔嫂。
函數簽名:
//判斷位串中的第bit位的值是0還是1
int bit_test(bitstr_t *name, int bit);
//判斷位串中第一個被設置為0的位置索引
bit_ffc(bitstr_t *name, int nbits, int *value);
//判斷位串中第一個被設置為1的位置索引
bit_ffs(bitstr_t *name, int nbits, int *value);
參數:
name:[in] 位串對象。
bit:[in] 位串的索引位置
nbits:[in] 位串的長度誊薄。
value:[out] 一個位置指針履恩,輸出位串的特定值的位置。
return:[out] 用于bit_test函數呢蔫,返回測試的結果切心。
描述:
bit_ffc函數和bit_ffs函數用來獲取某個位串長度下從右往左的順序中第一個為0或者第一個為1的值的索引位置。如果整個串都是1那么bit_ffc函數的返回值將是-1片吊, 如果整個串都是0那么bit_ffs的返回值將是-1.
示例代碼:
bitstr_t *p = bit_alloc(10); //0000000000
//位串設置
bit_set(p, 2); //0000000100
bit_nset(p, 7,8); //0110000100
bit_clear(p, 8); //0010000100
//位串測試
int ret = bit_test(p, 2); //ret == true
ret = bit_test(p,3); //ret == false
//位串測試2
int v1,v2;
bit_ffc(p, 10, &v1); //v1 == 0, 第一個為0的位置是第0位
bit_ffs(p, 10, &v2); //v2 == 2 第一個為1的位置是第2位绽昏。
free(p);
四、整數中的位標志讀取
功能:獲取整數中的第一個和最后一個比特值為1的位置定鸟。
頭文件: #include <strings.h>
平臺: POSIX
函數簽名:
//獲取整數中從右往左開始的第一個比特值為1的位置而涉。
int ffs(int value);
int ffsl(long value);
int ffsll(long long value);
//獲取整數中從右往左開始的最后一個比特值為1的位置。
int fls(int value);
int flsl(long value);
int flsll(long long value);
描述:
- 因為整數可以看成是一個具有固定長度的位串联予,因此針對整數系統提供了上述的函數啼县。上述函數返回的是比特值1所在的位置,并且是從1開始計數的沸久,如果返回0則表明這個整數值就是0季眷。
- ffs系列函數返回的是第一個比特位為1的位置。因此這個函數可以用來獲取整數的比特對齊的位數卷胯。
- fls系列函數返回的是最后一個比特位為1的位置子刮。
示例代碼:
int a = 5; //00000000000000000000000000000101
int idx = ffs(a); //idx == 1
idx = fls(a); //idx == 3
idx = ffs(0); // idx == 0
idx = fls(0); // idx == 0
五、整數中的位個數計數
功能:獲取一個整數中0或者1bit位的數量窑睁。
函數簽名:
//返回從左邊數起(高位)0的個數
int __builtin_clz (unsigned int x)
int __builtin_clzl (unsigned long x)
//返回從右邊數起(低位)0的個數
int __builtin_ctz (unsigned int x)
int __builtin_ctzl (unsigned long x)
//返回bit值為1的數量
int __builtin_popcount (unsigned int x)
int __builtin_popcountl (unsigned long x)
描述:
這6個函數是編譯器內聯的函數挺峡,用來獲取一個整數中的特定的比特位的個數。
示例代碼:
//10的二進制值為:00000000000000000000000000001010
int a = __builtin_clz(10); //a == 28
a = __builtin_ctz(10); // a == 1
a = __builtin_popcount(10); //a == 2