Помогите с побитовыми операциями

141
13 января 2021, 18:00
class Bitwise {
    public static void main (String[] args) {
    int fs = 53; //В двоичном виде 00110101
    System.out.println("Флаг 1: "+(( (fs&1 > 0) ? "ВКЛ" : "выкл")));
    System.out.println("Флаг 2: "+(( (fs&2 > 0) ? "ВКЛ" : "выкл")));
    System.out.println("Флаг 3: "+(( (fs&4 > 0) ? "ВКЛ" : "выкл")));
    System.out.println("Флаг 4: "+(( (fs&8 > 0) ? "ВКЛ" : "выкл")));
    System.out.println("Флаг 5: "+(( (fs&16 > 0) ? "ВКЛ" : "выкл")));
    System.out.println("Флаг 6: "+(( (fs&32 > 0) ? "ВКЛ" : "выкл")));
    System.out.println("Флаг 7: "+(( (fs&64 > 0) ? "ВКЛ" : "выкл")));
    System.out.println("Флаг 8: "+(( (fs&128 > 0) ? "ВКЛ" : "выкл")));
    }
}

Вот пример из книги которую читаю и совершенно не понимаю вот этого (fs&1 > 0) и аналогичных далее выражений.

Программа не компилируется...

А в примере в ответе книги такой ответ должно получиться:

Флаг 1: ВКЛ

Флаг 2: выкл

Флаг 3: ВКЛ

Флаг 4: выкл

Флаг 7: выкл

Флаг 8: выкл

Флаг 5: ВКЛ

Флаг 6: ВЫКЛ

Answer 1

Вот так правильно.

System.out.println("Флаг 1: " + ((fs & 1) > 0 ? "ВКЛ" : "выкл"));

У оператора '>' приоритет больше, поэтому получалось 53 & (1 > 0), потому и не компилировалось. Изучите приоритет операторов, чтобы не повторять эту ошибку.

Еще я убрал лишние скобки.

Насчет побитовых операций: выражение с побитовым И как раз применяется для проверки определенного бита или битовой маски. Оно оставляет в числе только те его биты, которые равны 1 в маске. Степени двойки как раз имеют только один бит равный 1, поэтому такая запись проверит ровно один бит числа, разряд которого соответствует степени двойки.

Чтобы установить биты числа, используют ИЛИ:

flags |= mask;

Для сброса битов делают так:

flags &= ~mask;

Это инверсия маски и сброс в 0 всех битов которые равны 0 в инвертированной маске (1 в обычной).

Вместо числа может быть выражение вида 1 << 5. Это сдвиг влево на 5 бит, он даст нам 32.

Answer 2

(fs&1 > 0) 53 - переводится в двоичное.110101. 1 переводится в двоичное - 1. Далее выполняется побитовое И. Результат - 110101 > 0 - поэтому true - ВКЛ

READ ALSO
Android не показывается DatePickerDialog в DialogFragment

Android не показывается DatePickerDialog в DialogFragment

Задача: реализовать фрагмент, который позволяет вернуть в место (во фрагмент), откуда этот фрагмент вызван, выбранную пользователем дату

126
Передача данных из RecyclerAdapter

Передача данных из RecyclerAdapter

хочу в этом куске кода

106
Android Room - Странные результаты

Android Room - Странные результаты

У меня есть Room таблица

102