Навыки развития: Сюэр, как одно поле может представлять восемь штатов?

Java
Навыки развития: Сюэр, как одно поле может представлять восемь штатов?

Во-первых, проблема

💡 Однажды внезапно возник спрос, какую курсовую работу отправил Сяомин?

🌱 A: Китайский язык B: Математика C: Английский язык D: Физика E: Химия F: Биология G: История H: География .....

  • Так много курсов...Мне нужно 8 полей? Что делать, если курсов больше? Нужно ли добавлять дополнительные поля?

  • Я уверен, что не паникую, я сделаю это в одном поле.

Во-вторых, решение

черезintилиlongполе для добавления нескольких флагов или состояний.intилиlongПоле, способное управлять несколькими значениями тегов (состояний). Как достигается такая волшебная операция? Ответ заключается в том, чтобы достичь ее с помощью битовых операций.

  • Таким образом, независимые состояния (теги) можно комбинировать друг с другом для создания новых состояний (тегов), и каждое независимое состояние (тег) имеет только истинное или ложное значение, мы можем использоватьбитовый статусконцепция управления этими состояниями.

  • Его основная идея состоит в том, чтобы рассматривать значение int как представление двоичной цифры.Если есть четыре состояния, оно может быть представлено 0000, как это, с четырьмя двоичными цифрами, и каждая двоичная цифра может представлять состояние.Затем с помощью битовых операций, чтобы Извлеките или добавьте биты флага.Есть 16 комбинированных состояний, соответствующих четырем битам.И нам нужно только управлять этими состояниями через переменную int.

  • Когда задействовано больше состояний (тегов), если вы используете отдельные переменные тега, вам нужно сгенерировать больше переменных, а с битовыми полями это независимое состояние может быть представлено одной переменной независимо от их количества. 32 независимых государства.

  • Основы работы с битами:

Основные побитовые операторы, представленные в java:与(&),或(|),非(~),异或(^),左移<<,右移(>>)и无符号右移(>>>).

кроме бита非(~)За исключением унарных операторов, все остальные являются бинарными операторами.

  • Далее представлены только битовые операции, используемые в этой статье:

1. Бит И

A & B: когда двоичные цифры, соответствующие A и B, равны 1, результат равен 1, в противном случае он равен 0.

A     =  001101 // 13
B     =  100101 // 37
A & B =  000101 // 5

2. Бит или

A | B: Когда двоичные цифры, соответствующие A и B, оба равны 0, результат равен 0, иначе — 1.

A     =  001101 // 13
B     =  100101 // 37
A | B =  101101 // 45

3. Бит не

~A: инвертировать каждый бит двоичного представления a, 0 в 1, 1 в 0. Эквивалентно противоположному числу - 1

A     =  001101 // 13
~A    =  11111111111111111111111111110010 // int32位,补码表示,第一位为符号位
// 根据上诉补码转原码为
//       10000000000000000000000000001110 // -14

4. Переключение влево

A << B: сдвинуть каждый бит двоичного представления A влево на B бит, Лишние биты слева обрезаются, а недостающие биты справа заполняются 0. В диапазоне значений перемещение на один бит эквивалентно умножению на 2.

A     =  001101 // 13
A << 1 = 011010 // 26

3. Реальная боевая операция

/**
 * @author LiJing
 * @ClassName: BitStatusUtils
 * @Description: 位运算处理状态的工具类
 * @date 2019/9/21
 * @time 10:38
 */
public class BitStatusUtils {

    //A:语文 B:数学 C:英语 D:物理 E:化学 F:生物 G:历史 H:地理 

    // 二进制表示 0001 没有交任何作业
    public static final int NONE              = 1<<0;   //默认
    public static final int CHINESE           = NONE<<1;//语文
    public static final int MATH              = NONE<<2;//数学
    public static final int ENGLISH           = NONE<<3;//英语
    public static final int PHYSICS           = NONE<<4;//物理
    public static final int CHEMISTRY         = NONE<<5;//化学
    public static final int BIOLOGY           = NONE<<6;//生物
    public static final int HISTORY           = NONE<<7;//历史
    public static final int GEOGRAPHY         = NONE<<8;//地理

    public static final int ALL =NONE|CHINESE|MATH|ENGLISH|PHYSICS|CHEMISTRY|BIOLOGY|HISTORY|GEOGRAPHY;

    /**
     * @param status 所有状态值
     * @param value  需要判断状态值
     * @return 是否存在
     */
    public static boolean hasStatus(long status, long value) {
        return (status & value) != 0;
    }

    /**
     * @param status 已有状态值
     * @param value  需要添加状态值
     * @return 新的状态值
     */
    public static long addStatus(long status, long value) {
        if (hasStatus(status, value)) {
            return status;
        }
        return (status | value);
    }

    /**
     * @param status 已有状态值
     * @param value  需要删除状态值
     * @return 新的状态值
     */
    public static long removeStatus(long status, long value) {
        if (!hasStatus(status, value)) {
            return status;
        }
        return status ^ value;
    }
    
     /**是否交了含有全部状态
     * @param status 
     * @return
     */
    public static boolean hasAllStatus(long status) {
        return (status & ALL) == ALL;
    }

    public static void main(String[] args) {

        long status = addStatus(NONE, CHINESE);
        System.out.println("小明交了语文作业:" + status);

        status = addStatus(status, PHYSICS);
        System.out.println("小明又交了物理作业:" + status);

        status = addStatus(status, HISTORY);
        System.out.println("小明还交了历史作业:" + status);

        status = removeStatus(status, HISTORY);
        System.out.println("小明撤销了历史作业:" + status);

        System.out.println("小明是否交了语文作业:" + hasStatus(status, CHINESE));
        System.out.println("小明是否交了历史作业:" + hasStatus(status, HISTORY));
        System.out.println("小明是否交了生物作业:" + hasStatus(status, BIOLOGY));
        System.out.println("小明是否交了全部作业:" + hasAllStatus(status));
    }
}

Результаты теста:

小明交了语文作业:3
小明又交了物理作业:19
小明还交了历史作业:147
小明撤销了历史作业:19
小明是否交了语文作业:true
小明是否交了历史作业:false
小明是否交了生物作业:false
小明是否交了全部作业:false

В-четвертых, идеальное резюме

  • Память состоит из байтов, каждый байт состоит из 8 бит, и состояние каждого бита может быть только 0 или 1.

  • Так называемый битовый паттерн есть не что иное, как последовательность состояний всех битов в памяти, занимаемой переменной

  • Сценарии применения:

    1. Для объекта заказа мы можем использовать такие статусы, как отправка, проверка, оплата, принятие и т. д.
    2. Статус пользователя шахмат и карточных игр
    3. Растровое (режим шахматной доски) положение (домен) шахматной доски: вверху, внизу, влево, вверху слева, вверху справа, внизу слева, внизу справа, азимут ожидания
    4. Отправляет ли пользователь несколько материалов для аутентификации и т. д.
  • Преимущество:

    1. Занимайте меньше памяти
    2. Эффективное копирование, установка, сравнение и т. д.
    3. Возможность бит-параллельных операций
  • недостаточный:

    1. трудно отлаживать
    2. Сложность доступа к отдельным битам, подверженность ошибкам
    3. Сложно масштабировать
    4. Не соответствует объектно-ориентированному стилю
    5. Не могу справиться со всеми задачами, требует много работы
  • Нравится? Если нравится, не стой на месте. Ставь лайк~~ Спасибо, что следишь за мной... Говорят, что лайк продлит тебе жизнь.