2011-10-18 74 views
4

我有一個系統字符指針數組,其中指出一些stirngs如何存儲字符串位來減少內存occpuied

每一個元素指向某些字符串 一件事記串只有1和0。

例如

我有存儲字符串如「100110」,所以其需要6個字節來存儲,但我想存儲此以比特,所以我減少存儲器occpuied字符指針。

+3

C或C++?他們是兩種不同的語言。 –

+0

'<<'操作符應該可以幫到你。 – Simon

+0

看看這裏: UPT

回答

3

在C風格,這樣的事情應該工作:

char* str = "100101"; 
unsigned out = 0; 

for (int i = 0; str[i]; i++) { 
    out = (out << 1); 
    if (str[i] == '1') 
     out++; 
} 

(我不能現在進行測試,所以請糾正我,如果我錯了)

說明:

str = "100101" 
out = 0000 0000 0000 0000 

i = 0: 
    out = 0000 0000 0000 0000 (out << 1) 
    out = 0000 0000 0000 0001 (out++ because str[0] == '1') 

i = 1: 
    out = 0000 0000 0000 0010 (out << 1) 

[...] 

i = 5: 
    out = 0000 0000 0010 0100 (out << 1) 
    out = 0000 0000 0010 0101 (out++ because str[5] == '1') 
+0

我會測試。這裏unsigned out是char? –

+0

可能是它的作品夥計我會檢查... thanx –

+0

'unsigned'是'unsigned int',根據你的字符串長度使用你想要的類型 – Simon

3

您是否嘗試過STL bitset容器?它正是爲了這個目的而優化的。或者,創建一個vectorbool元素將在內部打包位以節省空間。

+0

告訴我更多關於dis?的描述 –

-1

的一種方法是,定義char* []作爲一個全球性和使用其指數訪問它:

char stringLiterals [] = { "0101010", "10010010", "111", "010100100", ... }; 

使用: 而不是

char *p = stringLiteral[3]; 

使用

unsigned int idx = 3; 

原理:如果您將此字符串壓縮爲用於序列化目的的位而不是正常。但除此之外,我沒有看到任何壓縮它們的用例。在我上面的解決方案中,它不使用任何額外的內存。你已經有了一個字符串文字的數組;我只是要求在全球範圍內申報並使用其索引。

此外,如果字符串大小> 32字節,那麼您將無法將其存儲在單個32位int中。

+0

我不想訪問我想存儲「0101010」字符串的位。而不是字節 –

+0

你得到我的問題? –

+0

@SaurabhPatel,是的,我真的得到你的問題。我的回答告訴你代碼中的最終可用性。你在某個地方儲存'「010101」',然後再使用它,你又將它轉換回''010101''。除此之外,您可以將該字符串文字簡單地存儲到數組中並獲取其索引。它相當於**將**'「010101」'轉換爲單個'int'。如果你不是**處理序列化你的數據,那麼這種技術是有幫助的。我假設你想隱藏字符串文字,而不是一些變量的內容,在後面的情況下,你必須使用'vector'而不是數組 – iammilind

0

爲什麼不使用'strtol'?這是一個標準的lib函數。 或者你正在編寫內存不足硬件的低級代碼?

char *str = "010101"; 
int i = strtol(str ,(char**)NULL ,2); 

==> i=21