Java 一个字段存多个选项 位运算工具类

位运算工具类

位运算小轮子:

/**
 * Java 位运算的常用方法封装
*/
public class BitUtils { /** * 获取运算数指定位置的值
* 例如: 0000 1011 获取其第 0 位的值为 1, 第 2 位 的值为 0
* * @param source * 需要运算的数 * @param pos * 指定位置 (0<=pos<=7) * @return 指定位置的值(0 or 1) */
public static byte getBitValue(byte source, int pos) { return (byte) ((source >> pos) & 1); } /** * 将运算数指定位置的值置为指定值
* 例: 0000 1011 需要更新为 0000 1111, 即第 2 位的值需要置为 1
* * @param source * 需要运算的数 * @param pos * 指定位置 (0<=pos<=7) * @param value * 只能取值为 0, 或 1, 所有大于0的值作为1处理, 所有小于0的值作为0处理 * * @return 运算后的结果数 */
public static byte setBitValue(byte source, int pos, byte value) { byte mask = (byte) (1 << pos); if (value > 0) { source |= mask; } else { source &= (~mask); } return source; } /** * 将运算数指定位置取反值
* 例: 0000 1011 指定第 3 位取反, 结果为 0000 0011; 指定第2位取反, 结果为 0000 1111
* * @param source * * @param pos * 指定位置 (0<=pos<=7) * * @return 运算后的结果数 */
public static byte reverseBitValue(byte source, int pos) { byte mask = (byte) (1 << pos); return (byte) (source ^ mask); } /** * 检查运算数的指定位置是否为1
* * @param source * 需要运算的数 * @param pos * 指定位置 (0<=pos<=7) * @return true 表示指定位置值为1, false 表示指定位置值为 0 */
public static boolean checkBitValue(long source, int pos) { source = (long) (source >>> pos); return (source & 1) == 1; } /** * 入口函数做测试
* * @param args */
public static void main(String[] args) { int param = 3; System.out.println(getBitValue(Byte.parseByte(param+""),2)); // 取十进制 11 (二级制 0000 1011) 为例子 long source = 256; // 取第2位值并输出, 结果应为 0000 1011 for (byte i = 7; i >= 0; i--) { System.out.printf("%d ", getBitValue(source, i)); } // 将第6位置为1并输出 , 结果为 75 (0100 1011) System.out.println("\n" + setBitValue(source, 6, (byte) 1)); // 将第6位取反并输出, 结果应为75(0100 1011) System.out.println(reverseBitValue(source, 6)); // 检查第6位是否为1,结果应为false System.out.println(checkBitValue(source, 6)); // 输出为1的位, 结果应为 0 1 3 for (byte i = 0; i < 8; i++) { if (checkBitValue(source, i)) { System.out.printf("%d ", i); } } } }

扩展:

根据不同多选值的个数可以选择不同的整数类型:
byte,整型,1个字节,范围:-2的7次方 ~ 2的7次方-1;

short,整型,2个字节,范围:-2的15次方 ~ 2的15次方-1;

int,整型,4个字节,范围:-2的31次方 ~ 2的31次方-1;

long,整型,8个字节,范围:-2的63次方 ~ 2的63次方-1;


本文核心↓↓↓↓

正题Demo:

Service处理多选项保存到一个字段中

//setCheckes给用户添加多选项
public void doInsert(User user, String exampleArr){
      String exampleArr = "1,3,5";
      Integer item = 0; //这个用来存储多选项的二进制 例如 0001 + 0010 = 0011 这种二进制
      String[] params = exampleArr.split(","); //[1,3,5]
      for (String param : params) {
          Integer paramInt = Integer.valueOf(param);
          //选项值处理 例如:
		  //多选项0 = 1<<0;
		  //多选项1 = 1<<1;
		  //多选项2 = 1<<2;
          item += 1<<paramInt;
      }
      //结果:十进制:42,二进制:101010
      user.setCheckes(item);
      doInsert(user);
}

Service处理取回字段值,解析为多个选项

 Integer item = user.getCheckes();
        //这里有几个多选项就写几,当然可以提前写好,Intger 最多32个多选项
        Integer count = 32;
        List resultArr = new ArrayList();
        //例如:十进制:42,二进制:101010
        for (int i = 0; i < count; i++) {
            Integer checkInt = item >>> i;
            if((checkInt & 1) == 1){
                resultArr.add(i);
            }
        }
        //结果[1,3,5]
        return resultArr;

你可能感兴趣的:(知识回顾,项目心得,java,位运算)