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

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

🍡位串

所謂位串就是由0和1組成的bit串,好比:010010110011101101101011。能夠把位串當作是元素只有0和1組成的數組。通常狀況下大量數據的標誌位採用位串進行存儲這樣有利於存儲空間的節省,好比磁盤中分配的記錄塊的空閒標誌或者讀寫標誌等。位串的索引是從右往左從0開始計數。數據庫

功能: 系統提供了一套對位串進行0,1設置和0,1判斷的函數,用於對位串進行處理。系統提供的API函數都是以宏的形式提供的。數組

頭文件: #include <bitstring.h>bash

平臺: BSD Unix數據結構

1、位串的建立

功能: 用於建立一個位串對象,你能夠從堆內存中建立也能夠從棧內存中建立,位串的數據類型是bitstr_t數據結構和算法

函數簽名函數

//從堆內存中建立位串
 bitstr_t * bit_alloc(int nbits);
//從棧內存中聲明一個位串
 bit_decl(bitstr_t *name, int nbits);

//返回某個長度的位串須要佔用的字節數量。
 int bitstr_size(int nbits);

複製代碼

參數:post

nbits: [in] 指定位串的長度。測試

name: [in] 主要用於棧內存上分配位串,指定位串變量的名稱ui

return:[out] 函數返回一個位串對象的指針。

描述

用於創建一個位串對象,系統提供兩種方法:堆內存分配和棧內存分配,堆內存內部經過calloc進行分配,所以不使用時須要free掉,而棧內存則不須要釋放處理。

示例代碼:

bitstr_t *p1 = bit_alloc(20);   //從堆中分配20個長度的位串對象.
bitstr_t bit_decl(p2, 30);  //從棧內存中分配30個長度的位串對象.

//.....

free(p1);

複製代碼

2、位串的設置

功能:用於設置位串中某一位或者某一個區域的位的值,可設置的值只能爲1或者0.

函數簽名:

//將指定位置或者指定區域的值設置爲1 
  bit_set(bitstr_t *name, int bit);
  bit_nset(bitstr_t *name, int start, int stop); 
 
  //將指定位置或者指定區域的值設置爲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開始的,而且是從右往左進行遞增的,注意的是這個索引位置不能超過位串的長度。

3、位串的測試

功能:用來判斷位串中某個位置的值是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);

複製代碼

4、整數中的位標誌讀取

功能:獲取整數中的第一個和最後一個比特值爲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

複製代碼

5、整數中的位個數計數

功能:獲取一個整數中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
複製代碼
相關文章
相關標籤/搜索