例如:当某个商家支持金卡打折时,则保存“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