Что >> делает в Java? - PullRequest
       19

Что >> делает в Java?

14 голосов
/ 13 октября 2010

Хорошо, я попытался посмотреть, что значит >>, или shift, но это так, как этот сайт объясняет: http://www.janeg.ca/scjp/oper/shift.html

Так что кто-то может объяснить это, как будто он разговаривает сребенок

Ответы [ 4 ]

32 голосов
/ 13 октября 2010

Компьютеры - это бинарные устройства.Из-за этого числа представляются последовательностью из 1 и 0.

Сдвиг в битах просто перемещает эти последовательности из 1 и 0 влево или вправо.

Таким образом, все, что делает оператор >>, этосдвиньте биты вправо на один бит.

Рассмотрим число 101:

// Assuming signed 8-bit integers
01100101 // How 101 is represented in binary
00110010 // After right shifting one bit, this represents 50

Младший значащий бит в этом случае был усечен.Очевидно, дьявол кроется в деталях, но это все, что есть на самом деле.

Оператор << выполняет противоположную операцию:

// Assuming signed 8-bit integers
01100101 // How 101 is represented in binary
11001010 // After left shifting one bit, this represents -54

// Assuming unsigned 8-bit integers
01100101 // How 101 is represented in binary
11001010 // After left shifting one bit, this represents 202

В этом случае самый старший бит былусеченный, так как я использовал только 8 бит.Однако, если у числа было больше битов:

// Assuming signed 16-bit integers
00000000 01100101 // How 101 is represented in binary
00000000 11001010 // After left shifting one bit, this represents 202
00000001 10010100 // After left shifting one bit again, this represents 404

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

Приложение: Если вам интересно, как работает двоичная система, подумайте о том, как работает десятичная система счисления.Рассмотрим число 5287. Его можно записать так:

5287

Но вы также можете написать его так:

5287 = (5 * 1000) + (2 * 100) + (8 * 10) + (7 * 1)

Который вы затем можете написать так:

5287 = (5 * 10^3) + (2 * 10^2) + (8 * 10^1) + (7 * 10^0)

Приведенное выше уравнение объясняет, почему десятичную систему счисления иногда называют системой с основанием 10.В десятичной системе счисления используется 10 цифр (0-9).Обратите внимание на то, как показатели соответствуют позициям цифр.

Бинарная система счисления или система base-2 - это то же самое, но с номером два в качестве основы показателей и с использованием только двух цифр:0 и 1.

5287 = 00010100 10100111 (base 2)
     = (0 * 2^15) + (0 * 2^14) + (0 * 2^13) + (1 * 2^12)
     + (0 * 2^11) + (1 * 2^10) + (0 * 2^9)  + (0 * 2^8)
     + (1 * 2^7)  + (0 * 2^6)  + (1 * 2^5)  + (0 * 2^4)
     + (0 * 2^3)  + (1 * 2^2)  + (1 * 2^1)  + (1 * 2^0)
4 голосов
/ 13 октября 2010

Могу ли я предположить, что ребенок, с которым я разговариваю, немного знает о двоичном коде?:)

Все числа могут быть представлены в некотором двоичном виде, например:

   Base 10 : Base 2
   1 : 0001
   2 : 0010
   3 : 0011
   4 : 0100
   5 : 0101
   6 : 0110
   7 : 0111
   8 : 1000

... и т. Д.

Операторы сдвига в основном перемещают всебитов (1 с или 0 с) через одну позицию.Так, например: 000111 >> 1

сдвигает все биты в 000111 вправо на одно число для получения этого:

000011

000111 << 1 </p>

сдвигает все эти биты, оставленные одним, для получения этого:

001110

Если вы сдвигаете более чем на один, то это просто сдвигает биты дальше.В зависимости от того, какой язык вы используете и с какими числами вы работаете, это может быть немного сложнее.Например, если вы работаете на языке, где «старший значащий бит» (самый дальний слева от числа) представляет, подписано ли число или нет, то язык должен будет принять это во внимание.

Говоря математически, если вы берете целое число (и игнорируете риск переполнения, вызванного тем, что на компьютере недостаточно места для хранения битов), сдвиг влево на 1 (<< 1) эквивалентен умножению на2, и сдвиг вправо на 1 эквивалентен делению на 2. (Подумайте немного о том, сколько стоит «место» в двоичной математике, и это будет иметь смысл) </p>

3 голосов
/ 13 октября 2010

>> оператор SHIFT RIGHT

Пример:

class X
      { 
       public static void main(String args[])
       {
         System.out.println("20>>2 = "+20>>2);
       }
      }        

Выход: 20>>2 = 5

Пояснение:

Двоичное значение 20 равно: 00000000000000000000000000010100

сдвиг всех битов 2 позиций вправо 00000000000000000000000000000101

Это даст 5 (1*2^2 + 0*2^1 + 1*2^0)

0 голосов
/ 17 мая 2012

Однажды я написал JApplet (bitorgel) и разместил его на своей веб-странице , где можно поиграть с битовыми операторами.Вы можете попробовать его вживую или скачать исходный код.AFAIK, они работают одинаково в C, C ++ и Java - вероятно, в C # тоже.

...