我需要將bool值裝入字節。該字節可以包含這些字符中的一個。將bool值裝入字符中
(0至9和A至F)即十六進制字符。
我相信這些字符本質上是7位的,所以我們如何利用第8位來存儲布爾值並在後期檢索這兩個值?
我需要將bool值裝入字節。該字節可以包含這些字符中的一個。將bool值裝入字符中
(0至9和A至F)即十六進制字符。
我相信這些字符本質上是7位的,所以我們如何利用第8位來存儲布爾值並在後期檢索這兩個值?
你可以這樣做:
char pack(char c, bool b) {
char res = c;
if (b) {
res |= 128;
}
return res;
}
void unpack(char packed, char &c, bool &b) {
b = ((packed & 128) > 0);
c = packed & 127;
}
爲了便於操縱包裝的價值只是其中的一部分,你還可以添加的功能是這樣的:
char unpackChar(char packed) {
return packed & 127;
}
bool unpackBool(char packed) {
return ((packed & 128) > 0);
}
如果您添加它們,重新定義unpack()
與他們,而不是重複信息:
void unpack(char packed, char &c, bool &b) {
c = unpackChar(packed);
b = unpackBool(packed);
}
示例使用:
char packed = pack('A', true);
std::cout << unpackChar(packed);
謝謝。我可以在十六進制數字中得到結果字符嗎?例如,如果char c ='F'和bool = true,打包後我得到res ='╞'(198)。如果我可以有res =(0到9和A到F),有什麼辦法嗎? – PrinceSherdil
@PrinceSherdil嗯,什麼? 'res'的值是原始'c'和'b'的組合。當然,它不再等於'c'。如果你想得到原來的'c',使用'unpack()'。 – Angew
是的,我知道。但是我所說的是,如果我們可以進一步處理這個字節,使得生成的字符位於0到9之間並且A到F,那麼是否有任何方法? – PrinceSherdil
char
正在使用的位數完全取決於您如何使用它。如果您的編譯器的執行字符集與ASCII兼容,並且您在char
(可能通過使用字符文字)在ASCII範圍0-127內存儲字符,則您有一點額外的空間(如果CHAR_BIT == 8
)。
如果您只將十六進制字符存儲爲ASCII字符,那麼您真的有額外的兩位,因爲您使用的是0-63範圍內的字符。
不過,如果你想一個布爾變量存儲在您char
的第8位,你可以簡單一點它與你char
移的bool
值,然後按位OR:
char c = 'A';
bool b = true;
c |= (b << 7);
但是請注意,您無法打印此char
,並且預計仍會看到A
。 char
現在有不同的價值。
7位?看起來像4位給我。 – trojanfoe
也許你可以使用'uint8_t'。 – 0x499602D2
這樣做的目的是什麼?我問,因爲對於一個典型的應用程序來說,很少有必要在存儲上這麼高效(而不是說'std :: pair'),這樣做可能會讓你的代碼更難讀取,並且在某些情況下執行速度更慢。 –
JBentley