可能是一個簡單的問題,但我似乎正在遭受程序員的塊。 :)三個布爾值保存在一個tinyint
我有三個布爾值:A,B和C.我想將狀態組合保存爲一個無符號tinyint(max 255)到數據庫中,並能夠從保存的整數中派生狀態。 儘管組合的數量有限,但我希望避免將每個狀態組合硬編碼爲特定值(例如,如果A = true且B = true的值爲1)。 (A = 1,B = 2,C = 3)然後加,但是我不能區分A和B是真的,即只有C是真的。
我很難過,但很確定這是可能的。 由於
可能是一個簡單的問題,但我似乎正在遭受程序員的塊。 :)三個布爾值保存在一個tinyint
我有三個布爾值:A,B和C.我想將狀態組合保存爲一個無符號tinyint(max 255)到數據庫中,並能夠從保存的整數中派生狀態。 儘管組合的數量有限,但我希望避免將每個狀態組合硬編碼爲特定值(例如,如果A = true且B = true的值爲1)。 (A = 1,B = 2,C = 3)然後加,但是我不能區分A和B是真的,即只有C是真的。
我很難過,但很確定這是可能的。 由於
我認爲二元數學。選擇一個功率爲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位一起玩,並且可以存儲在那裏
所以可以保存8位tinyint中的布爾值數量?其中有BITS:八個。一位= 1或0的值,這正是布爾值所需的值。 (只是覺得對那些還沒有研究過的人解釋會很好。) – 2009-10-01 12:14:04
需要使用的二進制...
A = 1, B = 2, C = 4, d = 8, E = 16, F = 32, G = 64 , H = 128
這意味着A + B = 3,但C = 4。您永遠不會有兩個衝突的值。我列出了單個字節,8個值或(位)的最大值。
二進制數學正如其他人所說
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
我會補充說,你應該找到一種方法來不使用幻數。您可以使用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。許多語言會將邏輯運算抽象爲正常算術或「測試/設置」操作。
聽起來就像你想要一個位域。考慮將它們編碼爲兩個冪。 – Joe 2009-10-01 11:16:16
喬,爲什麼不把它當作答案? – KevinDTimm 2009-10-01 11:33:59
好點。我想我只是想給一個快速指針,而不是給出一個完整的答案。通常給予答案需要在向這個方向看時提供完整的代碼樣本。然後你得到downvoted ... – Joe 2009-10-01 12:18:47