Начал изучать Java

    15.06.2021 09:41    Java     нет комментариев

Выбрал базовый курс по Java на Stepic.org

Пока что все выглядит, как в анекдоте "Два плюс два равно четыре, а теперь решите тригонометрическое уравнение".

Похоже, что курс рассчитан на самостоятельное гугление. Тем не менее комментарии к задачам позволяют найти правильный путь.

Зачем мне Java, не случиться ли с ней тоже самой что с Machine Learning или Django? Надеюсь, что нет. Есть несколько компонентов облачной технологии 1С:Фреш, которые написаны на Java. Также есть 1C:EDT, который написан также на Java. Так что надеюсь, что эти знания не пропадут и будут использоваться на практике.

Понравилась задачка в самом начале:

Реализуйте метод flipBit, изменяющий значение одного бита заданного целого числа на противоположное. Данная задача актуальна, например, при работе с битовыми полями.
Договоримся, что биты нумеруются от младшего (индекс 1) к старшему (индекс 32).

Тут нужно понять что вообще требуется.

Для начала нужно понять, что параметр bitIndex - это индекс места единички в двоичном представлении числа. Т.е. если bitIndex = 1, то смещение должно выглядеть как 0001, если bitIndex = 2, то смещение должно выглядеть как 0010 и так далее. Тут я указал 4 цифры двоичного числа для краткости. Например если bitIndex = 7, то в двоичном виде это будет 1000000. Будем использовать единицу для смещения битов. При этом, если bitIndex = 1, то никакого смещения не требуется, т.к. мы уже находимся там где нужно. Чтобы получить нужное смещение, нужно вычесть из значения bitIndex единицу и для единицы сделать смещение битов влево, используя оператор cмещения - << .

Дальше нужно поменять значение бита у числа. Для этого нужно вспомнить как ведет себя операция XOR.

a  b xor
0  0  0  // ничего не происходит с битом
0  1  1  // бит a меняется на противоположный 0 -> 1
1  0  1  // ничего не происходит с битом
1  1  0  // бит a меняется на противоположный 1 -> 0

В результате получим решение:

public static int flipBit(int value, int bitIndex) {
    return value ^ (1 << --bitIndex);
}

Интереснее будет решение, если расширить выводимую информацию:

public static int flipBit(int value, int bitIndex) {
    int result = value ^ (1 << bitIndex - 1);
    System.out.println(value + " (" + Integer.toBinaryString(value) + ") и " + bitIndex
            + " (" + Integer.toBinaryString(1 << bitIndex - 1)
            + ") = " + result
            + " (" + Integer.toBinaryString(result) + ")");
    return result;
}

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

65 (1000001) и 1        (1) = 64   (1000000)
65 (1000001) и 2       (10) = 67   (1000011)
65 (1000001) и 3      (100) = 69   (1000101)
65 (1000001) и 8 (10000000) = 193 (11000001)
65 (1000001) и 7  (1000000) = 1          (1)

На простом примере из первой строки есть число 65 - это 1000001 в двоичном виде. Хотим поменять первый бит на противоположный, получим 1000000 в двоичном виде - это число 64 в десятиричном. И так далее.

Бложья косметика

0     0

blog comments powered by Disqus