Хорошо, я попытался посмотреть, что → , или сменяет, но это на моей голове, как объясняет этот сайт: http://www.janeg.ca/scjp/oper/shift.html
Так может кто-нибудь объяснить это, как будто они разговаривают с ребенком?
Хорошо, я попытался посмотреть, что → , или сменяет, но это на моей голове, как объясняет этот сайт: http://www.janeg.ca/scjp/oper/shift.html
Так может кто-нибудь объяснить это, как будто они разговаривают с ребенком?
Компьютеры - это двоичные устройства. Из-за этого числа представляются последовательностью 1s и 0s.
Bitshifting просто перемещает последовательности 1s и 0s влево или вправо.
Таким образом, все, что делает оператор >>
, это сдвиг битов вправо один бит.
Рассмотрим число 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)
Можно ли предположить, что ребенок, с которым я разговариваю, немного знает о двоичном коде?:)
Все числа могут быть представлены в каком-то двоичном виде, например:
Base 10 : Base 2
1 : 0001
2 : 0010
3 : 0011
4 : 0100
5 : 0101
6 : 0110
7 : 0111
8 : 1000
... и т.д.
Операторы сдвига в основном перемещают все биты (1s или 0s) в одну позицию. Так, например: 000111 → 1
сдвигает все биты в 000111 прямо на одно число, чтобы произвести это:
000011
000111 < 1
сдвигает все эти биты, оставленные на единицу, для создания этого:
001110
Если вы сдвигаетесь более чем на один, то он просто перемещает бит дальше.
Теперь, в зависимости от того, на каком языке вы работаете, и о количестве номеров, с которыми вы работаете, это может быть немного сложнее. Например, если вы работаете на языке, где "самый старший бит" (один самый дальний слева в номере) представляет собой число, подписанное или нет, тогда этот язык должен учитывать это.
Математически говоря, если вы берете целое число (и игнорируете риск переполнения, вызванный нехваткой места для хранения битов), сдвиг влево на 1 (< 1) является эквивалентом умножения на 2, а сдвиг вправо на 1 - это эквивалент деления на 2. (Подумайте немного о том, что стоит значение места в бинарных математиках, и это будет иметь смысл)
>>
Оператор 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
)
Я как-то написал JApplet (bitorgel) и разместил его на моей веб-странице, где можно играть с битовыми операторами. Вы можете попробовать его в прямом эфире или загрузить источник. AFAIK они работают одинаково на C, С++ и Java - возможно, и на С#.