复选框内容的二进制保存

前言

其实,这个标题也不知道怎么写,对于常见复选框如何在数据库保存的问题,一种常见的做法是用1,2,4,8 … 等值来对应每一项,然后保存的时候把勾选的每一项相加即可得到一个整数,并且用这个整数可以还原勾选的各项内容。
比如,勾选了2,4,8则保存成14,回显到页面的时候,14又可分解为2,4,8

原理

对于计算机专业的同学来说,很容易理解。上面的1,2,4,8…转换成二进制就是:
1:0001
2:0010
4:0100
8:1000

相当于给了4个占位符,0000,分别表示4个选项,如果第一项勾选了
那就在倒数第一位标上1,如果第二项勾选了就在倒数第二位标上1,于是就变成了:
选1: 0001 (1)
选2: 0010 (2)
选1和2:0011 (1+2=3)
选2和4:1010 (2+4=6)
全选:1111 (1+2+4+8=15)
括号里面的数字为十进制表示,存在数据库里的话只要存十进制就可以了。

代码实现

  1. 存储勾选的值

    public static int save(int ...vals) {
        int sum = 0;
        for (int val : vals) {
            sum |=val;
        }
        return sum;
    }
    
  2. 判断某个值是否包含在已勾选的值中

    public static boolean contains(int singleVal, int sumVal) {
        return (singleVal & sumVal) == singleVal;
    }
    
  3. 分解勾选的值

    public static List<Integer> separate(int sumVal) {
        List<Integer> valList = new ArrayList<>();
        for (int val = 1; val <= sumVal; val <<= 1) {
            if (contains(val, sumVal)) {
                valList.add(val);
            }
        }
        return valList;
    }
    

实例

有4个选项:A, B, C, D
将其value定为:1, 2, 4, 8
勾选了A,C, 则存储值为 save(1, 4) = 5
判断A是否包含在已选列表中:contains(1, 5) = true
判断D是否包含在已选列表中:contains(8, 5) = false
回显已选列表:separate(5) = [1, 4]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值