Начал изучать 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 в десятиричном. И так далее.
Начал Java, а изучил GoLang | Бложья косметика |
0 0 |