如何在单个值中表示4个布尔可能性

Raj*_*pta 15 java byte bit-manipulation bitwise-operators

我想在一个值中存储4个布尔可能性.例如,我想要一个值来告诉一个人是否:

IsSingle
IsGraduate
IsMale
IsLookingForPartner

因此,将它们存储在一个字节中是很好的,该字节可以分配4个比特,每个参数一个.如果该位设置为1,则该布尔参数为true.所以我可以做位移操作来找到所有都是真的.如果byte的值为111,则前三个参数为真.这是一个好方法吗?有没有更好的方法来实现这个?

我需要将此值存储为数据库中的单个参数.

Eri*_*rik 17

位标志.

public static final int IsSingle = 1 << 0;
public static final int IsGraduate = 1 << 1;
public static final int IsMale = 1 << 2;
public static final int IsLookingForPartner = 1 << 3;

...

if ((Value & IsSingle) != 0) {
}

if ((Value & IsGraduate) != 0) {
}

// Set "Single"
Value |= IsSingle;

// Remove "Graduate"
Value &= ~IsGraduate;
Run Code Online (Sandbox Code Playgroud)


Ana*_*yal 11

确实可以这样做,但不建议这样做.

如果您想在数据库中找到所有单身学生,该怎么办?还是男?虽然您节省的空间很小,但您放弃了将数据编入索引的可能性,以便更快地搜索,但要查找具有取决于任何这些属性的查询条件的任何数据,您将需要执行位移操作在所有记录上(或检查多个整数值),这将最终变得非常慢.

在我的拙见中,增加的复杂性实际上并没有带来太大的好处,数据库可以处理4个单独的字段,并且有充分的理由这样做(例如,轻松查询这些字段上的数据).


Pet*_*rey 10

您可能会发现EnumSet是表示此信息的自然方式.EnumSet在引擎盖下使用位掩码.

enum Interest {
   IsSingle,
   IsGraduate,
   IsMale,
   IsLookingForPartner 
}

EnumSet<Interest> interests = EnumSet.of(Interest.IsSingle, Interest.IsMale);
Run Code Online (Sandbox Code Playgroud)

您可以添加任意数量的枚举值.


vbe*_*nce 8

使用二进制包装.为它们定义常量:

IsSingle = 1;
IsGraduate = 2;
IsMale = 4;
IsLookingForPartner = 8;
Run Code Online (Sandbox Code Playgroud)

并将它们与逻辑OR运算结合起来.这样,每种可能性将由数字的二进制表示中的一位表示.您可以通过使用任何常量对打包值进行AND运算来检查:

short status = IsSingle | IsMale;    // will give 5

if ((status & IsMale) != 0)
    System.out.println("Male.");
Run Code Online (Sandbox Code Playgroud)