Понимание побитовых операций и их применения в Java
Я думаю, что понимаю, что они принципиально делают-оперируют битами (flip, shift, invert и т. д...).
Моя проблема заключается в том, что я не знаю, когда мне понадобится их использовать, и я не думаю, что полностью понимаю биты. Я знаю, что в байте есть 8 битов, и я знаю, что биты-это либо0
, либо 1
. Вот тут-то я и начинаю путаться... Я считаю, что типы данных определяют комбинации битов по-разному. Поэтому, если я объявляю int
, 32 бита откладываются для чисел, если я объявляю символ, 8 бит откладываются, и биты для этого типа данных определяют букву.
Работая с этой идеей, я сделал следующую основную операцию на java, которая меня смущает:
int num = 00000010;
System.out.println(num);
Это выводит 8
, и если я определяю num
таким образом:
int num = 00000100;
System.out.println(num);
Это печатает 64
Итак, чтобы попрактиковаться с побитовыми операциями (просто ради удовольствия), я попробовал следующее:
int num = 00000010 << 1;
System.out.println(num);
И он печатает 16
, где, как я думал, он сдвинет биты на один влево и печать 64
.
1 ответ:
Вы случайно указываетевосьмеричный литерал, когда указываете число с начальным нулем.
00000010 => 1*8^1 + 0*8^0 => 8 00000100 => 1*8^2 + 0*8^1 + 0*8^0 => 64
JLS, раздел 3.10.1 , описывает восьмеричные и двоичные литералы:
Восьмеричное число состоит из ASCII-цифры 0, за которой следует одна или несколько цифр. цифр ASCII от 0 до 7, перемежающихся подчеркиваниями, и может представьте положительное, нулевое или отрицательное целое число.
Двоичное число состоит из ведущих символов ASCII 0b или 0B затем следует одна или несколько цифр ASCII 0 или 1, перемежающихся с подчеркивание и может представлять положительное, нулевое или отрицательное целое число.
Вы сдвигаете бит вашего
8
на единицу влево, эффективно умножая его на2
, чтобы получить16
. В битах:00000100 => 00001000 (8 => 16)
Двоичные литералы выражаются с помощью ведущих
0b
, например:0b000010 => 2