网上看到一题是这样的 checkbox中有多个值时,为了节约数据空间,我们可以用2^n(n>=0)的值来作为value的值。比如有4个选项A,B,C,D。value分别为1,2,4,8。假如用户选了AC,那么数据库存的就是1+4=5,这样一个5就表示了用户选中的是A,C。取出是用5 分别与上面的1,2,4,8与运算不为0即表示用户选中过。
 
如5(0101)
   A(0001)
--------------
      0001-->!=0 表示用户选中A
 如5(0101)
   B(0010)
--------------
      0000-->==0 表示用户没用选中B
 
其他两项同理。
请问这个用2^n 做解题思路是不是有什么特殊之处呢,两个数相加后的值和这两个数做与运算怎么就这么巧有什么规律定理吗,谢谢

解决方案 »

  1.   

    这东西叫 bit set相当于把某类型的每一个 bit 都看成是一个 boolean 值由于加法运算的特性,你把每一个值都取在进制位上,做加法不会导致信息丢失,如果是10进制,你用 1 + 10 + 100 + 1000 ... 也不会导致某一位的 "boolean" 信息丢失,一样的。bit set 在Java API中的典型应用: EnumSet 类
    当某个 enum 的个数在 64 个以内的时候, 它的 EnumSet 对象实际上就是用了一个 long 来存储的 "bit set"。