Дважды больше, чем знак (>>) в Java? - PullRequest
37 голосов
/ 27 июня 2009

Что означает знак >> в Java? Я никогда не видел его раньше, но наткнулся на это сегодня. Я попытался найти его в Google, но не нашел ничего полезного.

Ответы [ 7 ]

73 голосов
/ 27 июня 2009

Оператор >> является оператором побитового сдвига вправо.

Простой пример:

int i = 4;
System.out.println(i >> 1); // prints 2 - since shift right is equal to divide by 2
System.out.println(i << 1); // prints 8 - since shift left is equal to multiply by 2

Отрицательные числа ведут себя одинаково:

int i = -4;
System.out.println(i >> 1); // prints -2
System.out.println(i << 1); // prints -8

Вообще говоря, i << k эквивалентно i*(2^k), а i >> k эквивалентно i/(2^k).

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

37 голосов
/ 27 июня 2009

Это оператор сдвига битов. Документация

Оператор левого сдвига со знаком "<<" немного сдвигает рисунок влево и подписанный оператор сдвига вправо ">>" немного сдвигает образец вправо. битовый шаблон задается левой рукой операнд и количество позиций сдвинуться правым операндом. Оператор правого сдвига без знака «>>>» сдвигает ноль в крайнее левое положение положение, в то время как крайнее левое положение после «>>» зависит расширение знака.

16 голосов
/ 27 июня 2009

сдвигает биты ...

вот некоторая информация о Java-операторах

Например

101  = 5
Shifting out the right "1"
10 = 2
Shifting the other way...
1010 = 10
6 голосов
/ 11 апреля 2013

Правильный сдвиг:

Оператор сдвига вправо, >>, сдвигает все биты в значении вправо на указанное число раз. Общая форма: значение >> число Здесь num указывает количество позиций для сдвига вправо значения в значении. То есть >> перемещает все биты в указанном значении вправо на количество битовых позиций, указанных в 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, поскольку расширение знака продолжает вводить больше единиц в старших битах. Иногда нежелательно подписывать значения-расширения, когда вы сдвигаете их вправо. Например, следующая программа преобразует значение байта в его шестнадцатеричное строковое представление. Обратите внимание, что смещенное значение маскируется с помощью AND с 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
4 голосов
/ 27 июня 2009

Это правый битовый сдвиг.

1 голос
/ 27 июня 2009

Как уже отмечали другие, это правильный битовый сдвиг. Вы увидите это во многих из так называемых языков в стиле C.

Чтобы получить подробную информацию о сдвиге битов, предоставленную другими пользователями StackOverflow, ознакомьтесь с вопросом, который я опубликовал много лет назад и который помог мне окончательно получить его: Руководство абсолютного новичка по бит-сдвигу . (Люди, которые опубликовали там, были достаточно любезны, чтобы углубиться в предмет, который, я надеюсь, также поможет вам.)

1 голос
/ 27 июня 2009

Я считаю, что это оператор сдвига битов. Как и в ходах все 1 и 0 на одну позицию вправо. (Я думаю, вы можете представить, что << делает ... :)) </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...