首页 > 数据库技术 > 详细

二进制位运算标识数据库多个属性

时间:2021-06-08 13:36:37      阅读:17      评论:0      收藏:0      [点我收藏+]

例如:当某个商家支持金卡打折时,则保存“1(0001)”,支持银卡时,则保存“2(0010)”,两种都支持,则保存“3(0011)”。

 


我们在编写SQL语句时,只需要通过“位”的与运算,就能简单的查询出想要数据:
[java] view plaincopy
//查询支持金卡打折的商家信息:
select * from factory where MEMBERCARD & b‘0001‘
或者:
select * from factory where MEMBERCARD & 1

//查询支持银卡打折的商家信息:
select * from factory where MEMBERCARD & b‘0010‘
或者:
Select * from factory where MEMBERCARD & 2


通过这样的处理方式既节省存储空间,查询时又简单方便。以上sql语句为MySQL的语法,其他数据库方法类似。并且“b‘0010‘”二进制的表示方式的语法是在5.0以后的版本才有。


注意:这种情况不同于在多种状态中只可能处于一种状态的情况,如性别等

下面代码是把二进制状态转为十进制状态:

例如:1,4,8 对应DB里的状态值为1101 那么就需要把1101这个二进制转为 1, 4, 8 这三种状态 

 public static void main(String[] args) {
        int tn = 1 + 4 + 8;
        System.err.println(Integer.toBinaryString(tn)); // 1101

        int Q = 1101;//将输入赋值给Q
        int n = 0; // 用于记录输入的数字是几位数,n的值就是输入的位数;
        int Z = 10; // 设置循环的范围
        for (int i = 0; i < Z; i++) {
            if (Math.pow(10, i) > Q) { // 利用循环将10的i次方倍依次增大,直到与输入的值在同一个量级时,i就是输入的总位数。
                n = i;
                break; // 一旦找到输入的总位数立即停止循环;
            }
        }
        int arr[] = new int[n]; // 根据输入的总位数创建一个数组用于存放被分开的各个位数上的数;
        int sum = 0; // 定义一个计数器用于依次将被分开的数存放到数组中,它的作用类似于指针;
        int A = 0; // 定义一个变量;
        for (int j = 1; j < Z; j++) {
            if (Math.pow(10, j) > Q & sum < n) {
                A = (int) Math.floor(Q / Math.pow(10, j - 1)); // A是新的Q从左到右依次被分离的数;
                int T = (int) (A * Math.pow(10, j - 1)); //
                Q = Q - T;// 新的Q等于旧的Q减去最接近Q的10的某次方;
                // arr[sum] = A; // 将分离到的数从左到右依次存放到数组中;
                arr[sum] = T;
                sum++; // 每次存放之后指针后移;
                j = 1;// 使循环重新开始,分离下一个数;
            }
            if (Math.pow(10, j) > Q && sum < n && Q < 10) {
                arr[arr.length - 1] = Q; // 直到值剩下一个小于10的数,直接存放到数组最后一个位置,循环结束;
                break; // 利用break终止循环
            }
        }
        System.err.println(Arrays.toString(arr));
        for (int i = 0; i < arr.length; i++) {//得到状态
            System.err.println(Integer.parseInt(String.valueOf(arr[i]), 2));
        }
    }

 

二进制位运算标识数据库多个属性

原文:https://www.cnblogs.com/luxuewu/p/14861983.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!