背景

  • Java基础-Java位运算 在JAVA基础篇中我们梳理了基础知识,学了理论后我们要用于实际项目中,我们知道二进制位是各种00010110101,组成,不是0就是1

  • 上面这种情况在项目中是不是可以存放各种状态位,1就是代表开启,0就是代表未开启,上面有多少位就可以代表多少个状态,而且在数据库里面只要存放一个int字段就行,后续获取和设置都可以使用位运算来处理

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package com.songsy.springboot.test.service.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* 二进制复合状态工具类
* @author songshuiyang
* @date 2023/5/2 12:57
*/
public class BinaryStateUtils {

private static final Logger LOGGER = LoggerFactory.getLogger(BinaryStateUtils.class);

/**
* 复合状态位
*/
public enum StateEnum{
ORDER(0,"已下单"),
PUSH(1,"已推送"),
REFUND(2,"已退款");

private Integer code;

private String desc;

public Integer getCode() {
return code;
}

public void setCode(Integer code) {
this.code = code;
}

public String getDesc() {
return desc;
}

public void setDesc(String desc) {
this.desc = desc;
}

private StateEnum(Integer code,String desc) {
this.code = code;
this.desc = desc;
}
}


/**
* 查询指定下标 位状态
* @param complexState 位状态
* @param index 指定下标
* @return
*/
public static int queryBinaryState(final int complexState, final int index) {
return (complexState >> index) & 1;
}

/**
* 设置指定下标 位状态
* @param complexState 位状态
* @param index 指定下标
* @return
*/
public static int setBinaryOpen(final int complexState, final int index) {
return (complexState | 1 << index);
}


/**
* 清除指定下标位状态
* @param complexState 位状态
* @param index 指定下标
* @return
*/
public static int clearBinaryOpen(int complexState,final int index){
complexState &= ~(1 << index);
return complexState;
}

/**
* 验证复合状态是否Ok
* @param complexState
* @param stateEnum
* @return
*/
public static boolean isOk(int complexState, StateEnum stateEnum) {
return queryBinaryState(complexState, stateEnum.code) > 0;
}

/**
* 设置复合状态
* @param complexState
* @param stateEnum
* @return
*/
public static int setOk(int complexState, StateEnum stateEnum) {
return setBinaryOpen(complexState, stateEnum.code);
}
}

测试类:

单元测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.songsy.springboot.test.service.util;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* 二进制复合状态工具类
* @author songshuiyang
* @date 2023/5/2 12:57
*/
public class BinaryStateUtilsTest {

private static final Logger LOGGER = LoggerFactory.getLogger(BinaryStateUtilsTest.class);


@Test
public void test1() {
LOGGER.info("0001 {}", BinaryStateUtils.isOk(1, BinaryStateUtils.StateEnum.ORDER));
LOGGER.info("0010 {}", BinaryStateUtils.isOk(2, BinaryStateUtils.StateEnum.PUSH));
LOGGER.info("0100 {}", BinaryStateUtils.isOk(4, BinaryStateUtils.StateEnum.REFUND));
}


@Test
public void test2() {
LOGGER.info("最开始状态 -----------------------");
int complexState = 0;
LOGGER.info("下单状态:{} 推送状态:{} 退款状态:{}",
BinaryStateUtils.isOk(complexState, BinaryStateUtils.StateEnum.ORDER),
BinaryStateUtils.isOk(complexState, BinaryStateUtils.StateEnum.PUSH),
BinaryStateUtils.isOk(complexState, BinaryStateUtils.StateEnum.REFUND));

LOGGER.info("然后用户下单了 -----------------------");
complexState = BinaryStateUtils.setOk(complexState, BinaryStateUtils.StateEnum.ORDER);
LOGGER.info("下单状态:{} 推送状态:{} 退款状态:{}",
BinaryStateUtils.isOk(complexState, BinaryStateUtils.StateEnum.ORDER),
BinaryStateUtils.isOk(complexState, BinaryStateUtils.StateEnum.PUSH),
BinaryStateUtils.isOk(complexState, BinaryStateUtils.StateEnum.REFUND));


LOGGER.info("然后用户退款了 -----------------------");
complexState = BinaryStateUtils.setOk(complexState, BinaryStateUtils.StateEnum.REFUND);
LOGGER.info("下单状态:{} 推送状态:{} 退款状态:{}",
BinaryStateUtils.isOk(complexState, BinaryStateUtils.StateEnum.ORDER),
BinaryStateUtils.isOk(complexState, BinaryStateUtils.StateEnum.PUSH),
BinaryStateUtils.isOk(complexState, BinaryStateUtils.StateEnum.REFUND));

}
}

输出结果

1
2
3
4
5
6
13:19:44.676 [main] INFO com.songsy.springboot.test.service.util.BinaryStateUtilsTest - 最开始状态 -----------------------
13:19:44.680 [main] INFO com.songsy.springboot.test.service.util.BinaryStateUtilsTest - 下单状态:false 推送状态:false 退款状态:false
13:19:44.681 [main] INFO com.songsy.springboot.test.service.util.BinaryStateUtilsTest - 然后用户下单了 -----------------------
13:19:44.681 [main] INFO com.songsy.springboot.test.service.util.BinaryStateUtilsTest - 下单状态:true 推送状态:false 退款状态:false
13:19:44.682 [main] INFO com.songsy.springboot.test.service.util.BinaryStateUtilsTest - 然后用户退款了 -----------------------
13:19:44.682 [main] INFO com.songsy.springboot.test.service.util.BinaryStateUtilsTest - 下单状态:true 推送状态:false 退款状态:true

总结

  • 利用位运算可以很方便的存放状态,数据库只需存放一个字段,可有效减少过多的变量定义或过多的表字段