2012-04-09 74 views
0

我想創建一個簡單的DBMS,雖然我已經閱讀了很多關於它,並已經設計了系統,我有一些關於實現的問題。C++:我需要一些指導如何創建動態大小的位圖

我需要知道什麼是C++中使用長度爲動態的一系列位的最佳方法。這一系列位將被保存,以便確定文件中的哪些頁面是空閒的而不是空閒的。對於單個文件,所使用的頁面數量是固定的,所以我可以使用一個bitset。但是,每個頁面和文件的記錄數量不會被修復。所以我不認爲這會是最好的方式。

我想也許只是使用一個字符序列,因爲每個字符是1個字節= 8位也許如果我使用他們的數組我可以創建我想要的位圖。我從來不需要在這麼低的級別上操縱比特,所以我真的不知道是否還有其他更好的方法來做到這一點,或者即使這種方法完全可以工作。

在此先感謝

+2

這是一個艱難的沒有一些實施細則(代碼)來回答。如果您正在實施DBMS,我強烈推薦由Sciore撰寫的「數據庫設計與實現」一書。 – ybakos 2012-04-09 22:49:32

+0

儘管廣泛不喜歡,「std :: vector 」可能適合您的情況。 – 2012-04-09 22:58:27

回答

0

如果您只是想要了解該位的基礎知識,以下是使用字符數組執行此操作的一種方法。

假設有對位的陣列(該長度需要(totalitems/8)):

unsigned char *bits; // this of course needs to be allocated somewhere 

你可以計算的索引,陣列和該位置內的特定位,如下所示:

// compute array position 
int pos = item/8; // 8 bits per byte 
// compute the bit within the byte. Could use "item & 7" for the same 
// result, however modern compilers will typically already make 
// that optimization. 
int bit = item % 8; 

然後你就可以檢查是否有位與以下(假設零基礎索引):

if (bits[pos] & (1 << bit)) 
    return 1; // it is set 
else 
    return 0; // it is not set 

下面將設置一個特定位:

bits[pos] |= (1 << bit); 

而下面可以用來清除特定位:

bits[pos] &= ~(1 << bit); 
0

我會實現一個包裝類和簡單地存儲在塊的鏈表,其中每個塊將舉行一個固定大小的數組位圖(我會用一個stdint型像uint32_t的,以確保給定比特數),那麼您只需將鏈接添加到您的列表中即可展開。我將作爲練習留給讀者。

相關問題