iOS標準庫中常用數據結構和算法之位串

上一篇:iOS標準庫中常用數據結構和算法之KV數據庫

??位串

所謂位串就是由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所在的位置,并且是從1開始計數的沸久,如果返回0則表明這個整數值就是0季眷。
  2. ffs系列函數返回的是第一個比特位為1的位置。因此這個函數可以用來獲取整數的比特對齊的位數卷胯。
  3. 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

下一篇:iOS標準庫中常用數據結構和算法之內存池


歡迎大家訪問歐陽大哥2013的github地址簡書地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末担钮,一起剝皮案震驚了整個濱河市橱赠,隨后出現的幾起案子,更是在濱河造成了極大的恐慌箫津,老刑警劉巖狭姨,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宰啦,死亡現場離奇詭異,居然都是意外死亡饼拍,警方通過查閱死者的電腦和手機赡模,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來师抄,“玉大人漓柑,你說我怎么就攤上這事∵端保” “怎么了欺缘?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挤安。 經常有香客問我,道長丧鸯,這世上最難降的妖魔是什么蛤铜? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮丛肢,結果婚禮上围肥,老公的妹妹穿的比我還像新娘。我一直安慰自己蜂怎,他們只是感情好穆刻,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杠步,像睡著了一般氢伟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幽歼,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天朵锣,我揣著相機與錄音,去河邊找鬼甸私。 笑死诚些,一個胖子當著我的面吹牛,可吹牛的內容都是我干的皇型。 我是一名探鬼主播诬烹,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弃鸦!你這毒婦竟也來了绞吁?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寡键,失蹤者是張志新(化名)和其女友劉穎掀泳,沒想到半個月后雪隧,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡员舵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年脑沿,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片马僻。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡庄拇,死狀恐怖,靈堂內的尸體忽然破棺而出韭邓,到底是詐尸還是另有隱情措近,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布女淑,位于F島的核電站瞭郑,受9級特大地震影響,放射性物質發(fā)生泄漏鸭你。R本人自食惡果不足惜屈张,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望袱巨。 院中可真熱鬧阁谆,春花似錦、人聲如沸愉老。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫉入。三九已至焰盗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劝贸,已是汗流浹背姨谷。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留映九,地道東北人梦湘。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像件甥,于是被迫代替她去往敵國和親捌议。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容