java获取整数二进制指定位数的值和给指定位数设置0或1(以及实际中的应用)

公司项目中领导要求数据库的一个字段用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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值