Как работают операторы сдвига в Java? [дубликат]
этот вопрос уже есть ответ здесь:
Я пытаюсь понять операторов сдвига и не мог получить много.
Когда я попытался выполнить приведенный ниже код
System.out.println(Integer.toBinaryString(2 << 11));
System.out.println(Integer.toBinaryString(2 << 22));
System.out.println(Integer.toBinaryString(2 << 33));
System.out.println(Integer.toBinaryString(2 << 44));
System.out.println(Integer.toBinaryString(2 << 55));
Я вам ниже
1000000000000
100000000000000000000000
100
10000000000000
1000000000000000000000000
может кто-нибудь объяснит?
9 ответов:
System.out.println(Integer.toBinaryString(2 << 11));сдвигает двоичное 2(
10) в 11 раз левее. Таким образом:1000000000000System.out.println(Integer.toBinaryString(2 << 22));сдвигает двоичное 2(
10) в 22 раза налево. Таким образом :100000000000000000000000System.out.println(Integer.toBinaryString(2 << 33));теперь int имеет 4 байта, следовательно, 32 бита. Поэтому, когда вы сдвигаете на 33, это эквивалентно сдвигу на 1. Таким образом :
100
2 из десятичной системы счисления в двоичной выглядит следующим образом
10теперь, если вы делаете
2 << 11это было бы, 11 нулей будут дополнены с правой стороны
1000000000000подписанный оператор сдвига влево " > " сдвигает битовый шаблон вправо. Битовый шаблон задается левым операндом, а число позиций для сдвига-правым операндом. Оператор сдвига вправо без знака "> > > "сдвигает ноль в крайнюю левую позицию, а крайняя левая позиция после "> > " зависит от расширения знака [..]
сдвиг влево приводит к умножению на 2 (*2) в терминах или арифметике
2 в двоичном
10, Если у вас<<1что будет100что это44 двоичный
100, если у вас<<1это было бы1000что это8
См. Также
правый и левый сдвиг работают одинаково вот как работает правый сдвиг; Сдвиг Вправо: Оператор сдвига вправо,>>, сдвигает все биты в значении вправо заданное количество раз. Его общая форма:
value >> numздесь num указывает количество позиций для правого сдвига значения в value. То есть, > > перемещает все биты в указанном значении вправо на количество разрядных позиций, указанных num. Следующий фрагмент кода сдвигает значение 32 на право на две позиции, в результате чего устанавливается значение 8:
int a = 32; a = a >> 2; // a now contains 8когда значение имеет биты, которые "сдвинуты", эти биты теряются. Например, следующий фрагмент кода сдвигает значение 35 на две правые позиции, что приводит к потере двух младших битов, в результате чего снова устанавливается значение 8.
int a = 35; a = a >> 2; // a still contains 8глядя на ту же операцию в двоичном показывает более четко, как это происходит:
00100011 35 >> 2 00001000 8каждый раз, когда вы сдвигаете значение справа, он делит это значение на два-и отбрасывает все остальные. Вы можете воспользоваться этим для высокопроизводительного целочисленного деления на 2. Конечно, вы должны быть уверены, что вы не сдвигая все биты с правого конца. Когда вы сдвигаете вправо, верхние (самые левые) биты, открытые правым сдвигом, заполняются предыдущим содержимым верхнего бита. Это называется расширением знака и служит для сохранения знака отрицательных чисел при их сдвиге вправо. Например,
–8 >> 1и–4, который, в двоичном виде, является11111000 –8 >>1 11111100 –4интересно отметить, что если вы сдвигаете -1 вправо, результат всегда остается -1, так как расширение знака продолжает приносить больше единиц в битах высокого порядка. Иногда не желательно подписывать-расширять значения, когда вы сдвигаете их вправо. Например, следующая программа преобразует значение байта в его шестнадцатеричное строковое представление. Обратите внимание, что сдвинутое значение маскируется, и оно с помощью 0x0f отбрасывает любые расширенные биты знака, поэтому что значение может быть использовано в качестве индекса в массив шестнадцатеричных символов.
// Masking sign extension. class HexByte { static public void main(String args[]) { char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; byte b = (byte) 0xf1; System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]); } }вот вывод этой программы:
b = 0xf1
Я считаю, что это может помочь:
System.out.println(Integer.toBinaryString(2 << 0)); System.out.println(Integer.toBinaryString(2 << 1)); System.out.println(Integer.toBinaryString(2 << 2)); System.out.println(Integer.toBinaryString(2 << 3)); System.out.println(Integer.toBinaryString(2 << 4)); System.out.println(Integer.toBinaryString(2 << 5));результат
10 100 1000 10000 100000 1000000редактировать:
должен прочитать это (как-делать-побитовый-сдвиг-операторы-работа)
Я думаю, что это будет следующее, например:
- знаковый сдвиг влево
[ 2 [10 (двоичный из 2) добавить 1 ноль в конце двоичной строки] следовательно, 10 будет 100, который становится 4.
знаковый сдвиг влево использует умножение... Так это также может быть рассчитан как 2 * (2^1) = 4. Другой пример [2 2 *(2^11) = 4096
- подписать сдвиг
[ 4 >> 1] is => [100 (двоичный из 4) Удалить 1 ноль в конце двоичной строки] следовательно, 100 будет 10, который становится 2.
подписанный сдвиг вправо использует деление... Так это также может быть рассчитан как 4 / (2^1) = 2 Другой пример [4096 >> 11] = 4096 / (2^11) = 2
он будет сдвигать биты заполнения, что многие
0's.например,
- binary
10что цифры2сдвиг влево на 21000что цифры8- binary
10что цифры2сдвиг влево на 310000что цифры16
сдвиг может быть реализован с типами данных (char, int и long int). Коннот поплавка и двойных данных был перенесен.
value= value >> steps // Right shift, signed data. value= value << steps // Left shift, signed data.
знаковый сдвиг влево Логически Просто, если 1
в программировании на java int a = 2
// it will result in 4096 2<<11 = 2*(2^11) = 4096
типичное использование сдвига переменной и присвоение переменной может быть переписано с помощью стенографических операторов ,>>= или >>>=, также известный в спецификации как Составные Операторы Присваивания.
например,
i >>= 2аналогично
i = i >> 2
Comments