可能是一个简单的问题,但我似乎受到了程序员的阻碍。 :)
我有三个布尔值:A,B和C.我想将状态组合保存为无符号tinyint(最大255)到数据库中,并能够从保存的整数中导出状态。 即使组合数量有限,我也希望避免将每个状态组合硬编码为特定值(如果A = true且B = true,则值为1)。
我试图给变量分配值(A = 1,B = 2,C = 3),然后加入,但我不能区分A和B是真的,即只有C为真。
我很难过,但很确定这是可能的。 感谢
答案 0 :(得分:5)
我认为二进制数学。选择一个2的幂(1,2,4,8蚀刻)的位置,然后你可以使用'按位和'运算符&确定价值。 假设A = 1,B = 2,C = 4
00000111 => A B和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个布尔值
答案 1 :(得分:1)
二进制数学正如其他人所说的那样
编码:
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
答案 2 :(得分: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。许多语言都会将逻辑运算抽象出正常算术或“测试/设置”操作。
答案 3 :(得分:0)
需要使用二进制......
A = 1, B = 2, C = 4, D = 8, E = 16, F = 32, G = 64, H = 128
这意味着A + B = 3但C = 4.您永远不会有两个冲突的值。我列出了单个字节,8个值或(位)的最大值。