2013-03-28 40 views
0

我需要將bool值裝入字節。該字節可以包含這些字符中的一個。將bool值裝入字符中

(0至9和A至F)即十六進制字符。

我相信這些字符本質上是7位的,所以我們如何利用第8位來存儲布爾值並在後期檢索這兩個值?

+1

7位?看起來像4位給我。 – trojanfoe

+0

也許你可以使用'uint8_t'。 – 0x499602D2

+0

這樣做的目的是什麼?我問,因爲對於一個典型的應用程序來說,很少有必要在存儲上這麼高效(而不是說'std :: pair '),這樣做可能會讓你的代碼更難讀取,並且在某些情況下執行速度更慢。 – JBentley

回答

2

你可以這樣做:

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); 
+0

謝謝。我可以在十六進制數字中得到結果字符嗎?例如,如果char c ='F'和bool = true,打包後我得到res ='╞'(198)。如果我可以有res =(0到9和A到F),有什麼辦法嗎? – PrinceSherdil

+1

@PrinceSherdil嗯,什麼? 'res'的值是原始'c'和'b'的組合。當然,它不再等於'c'。如果你想得到原來的'c',使用'unpack()'。 – Angew

+0

是的,我知道。但是我所說的是,如果我們可以進一步處理這個字節,使得生成的字符位於0到9之間並且A到F,那麼是否有任何方法? – PrinceSherdil

0

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,並且預計仍會看到Achar現在有不同的價值。