一.位状态概述
1、什么是位状态
在计算机科学中,位状态(Bit State)是指在计算机系统中用来表示信息的最小单位。"位"是二进制数字的缩写,表示二进制位(binary digit)。
位状态只能表示两种不同的状态,通常用0和1表示。这两种状态可以分别表示逻辑上的"假"和"真",或者是其他不同的含义,具体取决于上下文和所采用的编码规则。
计算机系统中的所有数据和指令都可以通过位状态进行表示和处理。计算机内部的所有操作都是基于位状态的逻辑运算,如与(AND)、或(OR)、非(NOT)等。通过对位状态进行组合和处理,计算机可以实现复杂的计算和逻辑操作。
位状态的组合形成了更高级别的数据表示,如字节(byte)、字(word)、整数、浮点数等。这些数据类型由多个位状态组成,可以表示更大范围的数值和更复杂的数据结构。
位状态在计算机科学中起着重要的作用,是数字信息处理的基础。它不仅在硬件层面上存在,也在软件和算法中广泛应用。——ChatGPT3.5
2、实际开发中的位状态
位状态就是以int或者long数字的二进制来表示状态
int有32位,最多就可以来表示32种属性的状态
long有64位,最多就可以用来表示64种属性的状态
3、为什么需要位状态
- 在实际开发当中,我们经常需要记录用户的账户安全、用户权限状态等等,那么这时候我们通常会涉及一个位状态字段来表示多个状态,这时候我们就需要用到位状态
2.位状态使用
1、导入位状态工具类
- 在工具类中已经约定好了每个状态对应的值
package com.cyx.yxcc.util;
/**
* 用户状态类,记录用户在平台使用系统中所有的状态。
* @author nixianhua
*/
public class BitStatesUtils {
/**
* 用户注册成功的标示,及为默认初始状态
*/
public final static long OP_REGISTED = 1L << 0;
/**
* 是否已激活(认证手机或认证邮箱)。
*/
public final static long OP_ACTIVED = 1L << 1;
/**
* 是否锁定(未锁定则没有该状态),安全监测程序/后台对用户的锁定操作。
*/
public final static long OP_LOCKED = 1L << 2;
/**
* 是否手机认证
*/
public final static long OP_AUTHED_PHONE = 1L << 3;
/**
* 是否邮箱认证
*/
public final static long OP_AUTHED_EMAIL = 1L << 4;
/**
* 是否完善个人信息
*/
public final static long OP_SAVE_BASIC_INFO = 1L << 5;
/**
* 是否正在进行实名认证
*/
public final static long OP_IDENTITY_AUTHING = 1L << 6;
/**
* 是否完成实名认证
*/
public final static long OP_IDENTITY_AUTHED = 1L << 7;
/**
* 是否初始化支付密码
*/
public final static long OP_INIT_PAY_PASSWORD = 1L << 8;
/**
* @param states 用户当前状态值
* @param value 需要判断状态值
* @return 是否存在
*/
public static boolean hasState(long states,long value){
return (states & value) == value;
}
/**
* @param states 已有状态值
* @param value 需要添加状态值
* @return 新的状态值
*/
public static long addState(long states,long value){
if(hasState(states, value)){
return states;
}
return (states | value);
}
/**
* @param states 已有状态值
* @param value 需要删除状态值
* @return 新的状态值
*/
public static long removeState(long states,long value){
if(!hasState(states, value)){
return states;
}
return states ^ value;
}
}
2、用户位状态初始化
private Long saveUser(SmsRegisterDto smsRegisterDto, Long loginId) {
String mobile = smsRegisterDto.getMobile();
User user = new User();
user.setPhone(mobile);
user.setNickName(mobile);
user.setLoginId(loginId);
// 设置用户位状态
long state = BitStatesUtils.addState(BitStatesUtils.OP_ACTIVED, BitStatesUtils.OP_REGISTED);
state = BitStatesUtils.addState(state, BitStatesUtils.OP_AUTHED_PHONE);
user.setBitState(state);
insert(user);
return user.getId();
}
3、测试
- 注册用户,查看初始位状态值