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)
您可以添加任意数量的枚举值.
使用二进制包装.为它们定义常量:
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)