我有一個系統字符指針數組,其中指出一些stirngs如何存儲字符串位來減少內存occpuied
每一個元素指向某些字符串 一件事記串只有1和0。
例如
我有存儲字符串如「100110」,所以其需要6個字節來存儲,但我想存儲此以比特,所以我減少存儲器occpuied字符指針。
我有一個系統字符指針數組,其中指出一些stirngs如何存儲字符串位來減少內存occpuied
每一個元素指向某些字符串 一件事記串只有1和0。
例如
我有存儲字符串如「100110」,所以其需要6個字節來存儲,但我想存儲此以比特,所以我減少存儲器occpuied字符指針。
在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')
我會測試。這裏unsigned out是char? –
可能是它的作品夥計我會檢查... thanx –
'unsigned'是'unsigned int',根據你的字符串長度使用你想要的類型 – Simon
的一種方法是,定義char* []
作爲一個全球性和使用其指數訪問它:
char stringLiterals [] = { "0101010", "10010010", "111", "010100100", ... };
使用: 而不是
char *p = stringLiteral[3];
使用
unsigned int idx = 3;
原理:如果您將此字符串壓縮爲用於序列化目的的位而不是正常。但除此之外,我沒有看到任何壓縮它們的用例。在我上面的解決方案中,它不使用任何額外的內存。你已經有了一個字符串文字的數組;我只是要求在全球範圍內申報並使用其索引。
此外,如果字符串大小> 32字節,那麼您將無法將其存儲在單個32位int
中。
我不想訪問我想存儲「0101010」字符串的位。而不是字節 –
你得到我的問題? –
@SaurabhPatel,是的,我真的得到你的問題。我的回答告訴你代碼中的最終可用性。你在某個地方儲存'「010101」',然後再使用它,你又將它轉換回''010101''。除此之外,您可以將該字符串文字簡單地存儲到數組中並獲取其索引。它相當於**將**'「010101」'轉換爲單個'int'。如果你不是**處理序列化你的數據,那麼這種技術是有幫助的。我假設你想隱藏字符串文字,而不是一些變量的內容,在後面的情況下,你必須使用'vector'而不是數組 – iammilind
爲什麼不使用'strtol'?這是一個標準的lib函數。 或者你正在編寫內存不足硬件的低級代碼?
char *str = "010101";
int i = strtol(str ,(char**)NULL ,2);
==> i=21
C或C++?他們是兩種不同的語言。 –
'<<'操作符應該可以幫到你。 – Simon
看看這裏: –
UPT