三个布尔值保存在一个tinyint中

时间:2009-10-01 11:14:17

标签: type-conversion

可能是一个简单的问题,但我似乎受到了程序员的阻碍。 :)

我有三个布尔值:A,B和C.我想将状态组合保存为无符号tinyint(最大255)到数据库中,并能够从保存的整数中导出状态。 即使组合数量有限,我也希望避免将每个状态组合硬编码为特定值(如果A = true且B = true,则值为1)。

我试图给变量分配值(A = 1,B = 2,C = 3),然后加入,但我不能区分A和B是真的,即只有C为真。

我很难过,但很确定这是可能的。 感谢

4 个答案:

答案 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个值或(位)的最大值。