Понимание побитовых операций и их применения в 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 2

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