公司项目中领导要求数据库的一个字段用int类型的二进制表示多种状态
每个下标对应不同的状态,1表示正常0表示不正常
如7的二进制是111,则表示三个状态都正常6的二进制110表示第一个不正常,第二第三个都正常.
要查询第二个状态是正常的,直接sql也能查出.
如要查出第3位是正常所有记录
select * from tableName where (column >> (3-1)) & 1 = 1;
这个样表示的好处就是便于以后扩展,以后的状态有增减不用修改数据库.
package com.base;
/**
* @Authro: QYF
* @Time:2021/2/26 21:38
*/
public class BinaryDemo {
public static void main(String[] args) {
//整数
int num = 18;
//转成二进制
String binary = Integer.toString(num, 2);
//从低位算,获取第几位是否为1
int index = 2;
boolean flag = getStatusType(num, index);
System.out.println(num + "的二进制为:" + binary + ",二进制第:" + index + "位为:" + (flag ? 1 : 0));
//状态
int status = 0;
int result = updateStatusType(num, index, status);
System.out.println(num + "的二进制为:" + binary + ",把第" + index + "位改成" + status);
System.out.println(result + "的二进制为:" + Integer.toString(result, 2));
}
/**
* 判断第几位是否为1
* <p>
* 如18的二进制为10010,要获取第3位,则右移(3-1)位得100,第2位变成第1位,这样就可以和&1,最低位为1返回1,为0则返回0
*
* @param num 整数
* @param index 低位起第几位下标
* @return
*/
private static boolean getStatusType(int num, int index) {
return (num >> (index - 1) & 1) == 1;
}
/**
* @param num 整数
* @param index 低位起第几位下标
* @param status 要修改的状态
* @return
*/
private static int updateStatusType(int num, int index, int status) {
if (status != 0 && status != 1) {
throw new IllegalArgumentException();
}
if (status == 1) {
//1向左移(index-1) 和10010 或
return (1 << (index - 1)) | num;
} else {
//先判断原来是不是0,原来是0则直接返回
if (!getStatusType(num,index)){
return num;
}
//10010 - 1向左移(index-1)
return num - (1 << (index - 1));
}
}
}
输出结果:
18的二进制为:10010,二进制第:2位为:1
18的二进制为:10010,把第2位改成0
16的二进制为:10000