Подтвердить что ты не робот

Java "Бит Shifting" Учебник?

Я был бы благодарен за хороший учебник, который объясняет для java новичков, как в java все "смещение бит" работает.

Я всегда наткнулся на него, но никогда не понимал, как это работает. Он должен объяснить все операции и концепции, которые возможны с помощью функции byteshifting/bitmanipulation в java.

Это просто пример того, что я имею в виду (но я ищу учебник, объясняющий каждую возможную операцию):

byte b = (byte)(l >> (8 - i << 3));
4b9b3361

Ответ 1

Хорошо, официальный учебник Java Побитовые и операторы сдвига бит описывает фактические операции, доступные на Java, и способы их вызова.

Если вам интересно, "что я могу сделать с перестановкой битов", то это не специфично для Java, и поскольку это низкоуровневая техника, я не знаю ни одного списка "классных вещей, которые вы можете" делать за как таковые. Было бы полезно ознакомиться с определениями и открыть глаза для другого кода, где это используется, чтобы посмотреть, что они сделали.

Обратите внимание, что часто бит-twiddling - это выигрыш в эффективности за счет ясности. Например, a << 1 обычно совпадает с a * 2, но, возможно, менее ясным. Повторяющиеся XOR могут менять два числа без использования временной переменной, но обычно считается лучшей формой для более четкого написания кода с временной переменной (или даже лучше, в методе утилиты). Поэтому в этом отношении трудно привести отличные примеры, потому что вы вряд ли достигнете чего-то нового или глубокого уровня архитектуры; все о деталях низкого уровня. (И я бы оценил, что огромное количество применений бит-twiddling "в дикой природе" являются примерами преждевременной оптимизации.)

Ответ 2

При использовании оператора сдвига будьте очень осторожны, чтобы не повторить общую ошибку!

Как следует из следующего SO post, автор принятого ответа упоминает:

"В некоторых языках применение операторов сдвига к любому типу данных, меньшему, чем int, автоматически изменяет размер операнда, ИНТ".

Это абсолютно важно помнить, например, при работе с байтами, иначе вы можете получить неожиданные результаты (как и я).

Заданный байт со следующим битовым шаблоном:

1001 0000

Когда я попытался сдвинуть бит на 4 и присвоить int, например:

int value = byteValue >>> 4;

Я бы ожидал:

0000 1001   (or a value of 9)

Но я бы получил ОГРОМНОЕ число! Это потому, что byteValue передается в int BEFORE операцию смещения битов, что приводит к чему-то вроде этого:

1111 1111 1111 1111 1111 1111 1001

Ответ 3

Существует бесконечное количество возможных комбинаций. Однако они будут состоять из одной или нескольких комбинаций

>> shift right with sign extension.
>>> shift right with out sign extension.
<< shift left.

Чтобы понять, я предлагаю вам написать двоичные числа на бумаге и выяснить, что происходит. Попытка прочитать его в учебнике не гарантирует понимания. esp, если они пока не помогли.

Ответ 4

Существует простой, но понятный учебник, который я считаю полезным здесь

Ответ 5

Это не совсем учебное пособие, но у меня есть персональная библиотека функций смещения бит на Java, которую вы очень желанно изучаете!

Также, если вы выполните поиск по побитовые трюки, вы найдете много материала. Многие из них находятся в C/С++, но, как правило, тривиально конвертировать в Java, поскольку большая часть синтаксиса одинакова.

Ответ 6

Ниже приведены сведения о том, как работает сдвиг бит. Существует неинтуитивное поведение, которое не распространяется на официальное руководство. Например, правый операнд имеет ограниченный диапазон (0-31 для int, 0-63 для долгого) и не будет вызывать предупреждения, если вы превысите этот диапазон - он просто усечет биты (т.е.% 32 или% 64), что может привести к поведению, отличному от ожидаемого.

Ответ 7

Этот сайт, кажется, дает довольно хороший учебник о том, что вы можете делать с манипуляциями с битами (поэтому не относится к java, но так как это довольно легко перевести)

http://www.bogotobogo.com/cplusplus/quiz_bit_manipulation.html

В приведенном ниже учебном пособии

  • Побитовые операции
  • Установка и очистка бит
  • Отображение целого с битами
  • Преобразование десятичного в шестнадцатеричный
  • Количество битов, заданных в целых числах (количество единиц)
  • Позиция битового набора целых чисел
  • Ввод целочисленного свопа с манипуляцией с битами
  • Количество бит, необходимых для преобразования целого числа A в целое число B
  • Обмен четными и четными битами в целых числах
  • Что (n и (n-1) == 0) проверяет?
  • Два дополнения
  • Отражение n-го бита целого числа
  • Бит бит номера с плавающей запятой
  • Палиндром палитры битов целого числа

Здесь файл, имеющий кучу реализаций java

http://geekviewpoint.com/

Ответ 8

Это два хороших учебника, которые я нашел во время изучения смещения битов, они существуют в java, но большинство языков используют одни и те же операторы, и теория одинакова.