Во-первых, проблема
💡 Однажды внезапно возник спрос, какую курсовую работу отправил Сяомин?
🌱 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.
-
Так называемый битовый паттерн есть не что иное, как последовательность состояний всех битов в памяти, занимаемой переменной
-
Сценарии применения:
- Для объекта заказа мы можем использовать такие статусы, как отправка, проверка, оплата, принятие и т. д.
- Статус пользователя шахмат и карточных игр
- Растровое (режим шахматной доски) положение (домен) шахматной доски: вверху, внизу, влево, вверху слева, вверху справа, внизу слева, внизу справа, азимут ожидания
- Отправляет ли пользователь несколько материалов для аутентификации и т. д.
-
Преимущество:
- Занимайте меньше памяти
- Эффективное копирование, установка, сравнение и т. д.
- Возможность бит-параллельных операций
-
недостаточный:
- трудно отлаживать
- Сложность доступа к отдельным битам, подверженность ошибкам
- Сложно масштабировать
- Не соответствует объектно-ориентированному стилю
- Не могу справиться со всеми задачами, требует много работы
- Нравится? Если нравится, не стой на месте. Ставь лайк~~ Спасибо, что следишь за мной... Говорят, что лайк продлит тебе жизнь.