Java按位操作工具类

/**
 * Bit转换工具
 */
@SuppressWarnings({"WeakerAccess", "unused"})
public class ConvertBit {
    /**
     * 短整型(int16)数据中包含的有效bit数量
     */
    public static final int BITS_IN_SHORT = 8 /*bits in one byte*/ * 2 /*bytes*/;
    /**
     * 整型(int32)数据中包含的有效bit数量
     */
    public static final int BITS_IN_INT = 8 /*bits in one byte*/ * 4 /*bytes*/;
    /**
     * 长整型(int64)数据中包含的有效bit数量
     */
    public static final int BITS_IN_LONG = 8 /*bits in one byte*/ * 8 /*bytes*/;

    /**
     * 从源数据中读取左数指定位置的一位bit值(0或1),不改变源数据
     * @param source 源数据
     * @param index 指定的索引,[0, BITS_IN_SHORT)
     * @return 指定索引处的bit值,true表示1,false表示0,如超出索引则始终返回false
     */
    public static boolean readBit(short source, int index) {
        if (index < 0 || index >= BITS_IN_SHORT) return false;
        return ((source >>> (BITS_IN_SHORT - 1 - index)) & 0x01) == 0x01;
    }

    /**
     * 更新源数据中的指定位置的一位bit值(0或1),返回更新后的数据,不改变源数据
     * @param source 源数据
     * @param index 指定的索引,[0, BITS_IN_INT)
     * @param bitValue 指定索引处的bit值,true表示1,false表示0
     * @return 更新后的数据,如索引超出则不改变数据
     */
    public static short writeBit(short source, int index, boolean bitValue) {
        if (index < 0 || index >= BITS_IN_SHORT) return source;
        int flag = 0x01 << (BITS_IN_SHORT - 1 - index);
        if (bitValue) return (short) ((source | flag) & 0xFFFF);
        else return (short) ((source & (~flag)) & 0xFFFF);
    }

    /**
     * 从源数据中读取左数指定位置的一位bit值(0或1),不改变源数据
     * @param source 源数据
     * @param index 指定的索引,[0, BITS_IN_INT)
     * @return 指定索引处的bit值,true表示1,false表示0,如超出索引则始终返回false
     */
    public static boolean readBit(int source, int index) {
        if (index < 0 || index >= BITS_IN_INT) return false;
        return ((source >>> (BITS_IN_INT - 1 - index)) & 0x01) == 0x01;
    }

    /**
     * 更新源数据中的指定位置的一位bit值(0或1),返回更新后的数据,不改变源数据
     * @param source 源数据
     * @param index 指定的索引,[0, BITS_IN_INT)
     * @param bitValue 指定索引处的bit值,true表示1,false表示0
     * @return 更新后的数据,如索引超出则不改变数据
     */
    public static int writeBit(int source, int index, boolean bitValue) {
        if (index < 0 || index >= BITS_IN_INT) return source;
        int flag = 0x01 << (BITS_IN_INT - 1 - index);
        if (bitValue) return source | flag;
        else return source & (~flag);
    }

    /**
     * 从源数据中读取左数指定位置的一位bit值(0或1),不改变源数据
     * @param source 源数据
     * @param index 指定的索引,[0, BITS_IN_LONG)
     * @return 指定索引处的bit值,true表示1,false表示0,如超出索引则始终返回false
     */
    public static boolean readBit(long source, int index) {
        if (index < 0 || index >= BITS_IN_LONG) return false;
        return ((source >>> (BITS_IN_LONG - 1 - index)) & 0x01) == 0x01;
    }

    /**
     * 更新源数据中的指定位置的一位bit值(0或1),返回更新后的数据,不改变源数据
     * @param source 源数据
     * @param index 指定的索引,[0, BITS_IN_LONG)
     * @param bitValue 指定索引处的bit值,true表示1,false表示0
     * @return 更新后的数据,如索引超出则不改变数据
     */
    public static long writeBit(long source, int index, boolean bitValue) {
        if (index < 0 || index >= BITS_IN_LONG) return source;
        long flag = ((long) 0x01) << (BITS_IN_LONG - 1 - index);
        if (bitValue) return source | flag;
        else return source & (~flag);
    }

}

posted @ 2022-08-30 18:02  超级鲨鱼辣椒  阅读(288)  评论(0编辑  收藏  举报