【问题标题】:Three boolean values saved in one tinyint三个布尔值保存在一个 tinyint 中
【发布时间】:2009-10-01 11:14:17
【问题描述】:

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

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

我尝试为变量赋值(A=1,B=2,C=3)然后添加,但我无法区分 A 和 B 是否为真,即只有 C 为真。

我很困惑,但很确定这是可能的。 谢谢

【问题讨论】:

  • 听起来你想要一个位域。考虑将它们编码为 2 的幂。
  • 乔,为什么不将此作为答案发布?
  • 好点。我想我只是想给出一个快速的指示而不是给出一个完整的答案。当“朝这个方向看”时,通常给出答案需要给出完整的代码示例。然后你被否决了......

标签: type-conversion


【解决方案1】:

我认为是二进制数学。选择一个 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 个布尔值

【讨论】:

  • 那么可以在 8 位 tinyint 中保存多少个布尔值?与 BITS 一样多:八个。一位 = 一个值 1 或 0,这正是布尔值所需要的。 (只是觉得向那些没有研究过的人解释一下会很好。)
【解决方案2】:

其他人所说的二进制数学

编码:

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

【讨论】:

    【解决方案3】:

    我要补充一点,您应该找到一种方法来不使用幻数。您可以使用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。许多语言会将逻辑操作抽象到普通算术或“测试/设置”操作之后。

    【讨论】:

      【解决方案4】:

      需要使用二进制...

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

      这意味着 A + B = 3 但 C = 4。您永远不会有两个冲突的值。我列出了单个字节、8 个值或(位)的最大值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-25
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-06
        相关资源
        最近更新 更多