请教一个2^n算法思路
网上看到一题是这样的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,2,4,8,5好像没什么联系,转化成二进制就明显多了。 --------------------编程问答-------------------- 因为这样的做法相当于每一个位代表的就是一个选项了。不妨看下1,2,4,8的2禁制表示
1=0001
2=0010
4=0100
8=1000
也就是说当一个表示的数如5=0101也即表示选择了第一位和第三位
因为每一位只代表一种选择,所以1不会影响2,4,8
所以当其中一个相加,如同是选择了2,4 也即只选择第二位和第三位,也就是相当于或|操作了。
所以在这种情况下,相加和或|操作是一样的
不是与,是| 或 --------------------编程问答-------------------- 顶下,这还真是巧妙啊 --------------------编程问答-------------------- 这东西叫 bit set
相当于把某类型的每一个 bit 都看成是一个 boolean 值
由于加法运算的特性,你把每一个值都取在进制位上,做加法不会导致信息丢失,如果是10进制,你用 1 + 10 + 100 + 1000 ... 也不会导致某一位的 "boolean" 信息丢失,一样的。
bit set 在Java API中的典型应用: EnumSet 类
当某个 enum 的个数在 64 个以内的时候, 它的 EnumSet 对象实际上就是用了一个 long 来存储的 "bit set"。
补充:Java , Java SE