Java "Бит Shifting" Учебник?
Я был бы благодарен за хороший учебник, который объясняет для java новичков, как в java все "смещение бит" работает.
Я всегда наткнулся на него, но никогда не понимал, как это работает. Он должен объяснить все операции и концепции, которые возможны с помощью функции byteshifting/bitmanipulation в java.
Это просто пример того, что я имею в виду (но я ищу учебник, объясняющий каждую возможную операцию):
byte b = (byte)(l >> (8 - i << 3));
Ответы
Ответ 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, но большинство языков используют одни и те же операторы, и теория одинакова.