2009-10-01 72 views
0

可能是一個簡單的問題,但我似乎正在遭受程序員的塊。 :)三個布爾值保存在一個tinyint

我有三個布爾值:A,B和C.我想將狀態組合保存爲一個無符號tinyint(max 255)到數據庫中,並能夠從保存的整數中派生狀態。 儘管組合的數量有限,但我希望避免將每個狀態組合硬編碼爲特定值(例如,如果A = true且B = true的值爲1)。 (A = 1,B = 2,C = 3)然後加,但是我不能區分A和B是真的,即只有C是真的。

我很難過,但很確定這是可能的。 由於

+3

聽起來就像你想要一個位域。考慮將它們編碼爲兩個冪。 – Joe 2009-10-01 11:16:16

+0

喬,爲什麼不把它當作答案? – KevinDTimm 2009-10-01 11:33:59

+0

好點。我想我只是想給一個快速指針,而不是給出一個完整的答案。通常給予答案需要在向這個方向看時提供完整的代碼樣本。然後你得到downvoted ... – Joe 2009-10-01 12:18:47

回答

5

我認爲二元數學。選擇一個功率爲2(1,2,4,8蝕刻)的位置,然後你可以使用'按位和'運算符來確定這個值。 說A = 1,B = 2,C = 4

00000111 => AB和C => 7

00000101 => A和C => 5

00000100 => C => 4

然後才能確定他們:

if(val & 4) // same as if (C) 
if(val & 2) // same as if (B) 
if(val & 1) // same as if (A) 

if((val & 4) && (val & 2) ) // same as if (C and B) 

無需一個狀態表。

編輯:反映意見 如果TINYINT有255最大值=>你有8位一起玩,並且可以存儲在那裏

+1

所以可以保存8位tinyint中的布爾值數量?其中有BITS:八個。一位= 1或0的值,這正是布爾值所需的值。 (只是覺得對那些還沒有研究過的人解釋會很好。) – 2009-10-01 12:14:04

0

需要使用的二進制...

A = 1, B = 2, C = 4, d = 8, E = 16, F = 32, G = 64 , H = 128

這意味着A + B = 3,但C = 4。您永遠不會有兩個衝突的值。我列出了單個字節,8個值或(位)的最大值。

1

二進制數學正如其他人所說

8個布爾值編碼:

myTinyInt = A*1 + B*2 + C*4 (assuming you convert A,B,C to 0 or 1 beforehand) 

解碼

bool A = myTinyInt & 1 != 0 (& is the bitwise and operator in many languages) 
bool B = myTinyInt & 2 != 0 
bool C = myTinyInt & 4 != 0 
1

我會補充說,你應該找到一種方法來不使用幻數。您可以使用Left Logical/Bit Shift將常量位掩碼轉換爲常量,該常數位位置是位字段中感興趣的標誌的位置。 (哇...這使得幾乎沒有任何意義。)在C++中的一個例子是:

enum Flags { 
    kBitMask_A = (1 << 0), 
    kBitMask_B = (1 << 1), 
    kBitMask_C = (1 << 2), 
}; 

uint8_t byte = 0;  //   byte = 0b00000000 
byte |= kBitMask_A;  // Set A, byte = 0b00000001 
byte |= kBitMask_C;  // Set C, byte = 0b00000101 
if (byte & kBitMask_A) { // Test A, (0b00000101 & 0b00000001) = T 
    byte &= ~kBitMask_A; // Clear A, byte = 0b00000100 
} 

在任何情況下,我建議你喜歡的編程語言尋找Bitset support。許多語言會將邏輯運算抽象爲正常算術或「測試/設置」操作。

相關問題