Рассмотрите:
echo 50 >> 4;
Вывод:
3
Почему это производит 3?
50 в двоичном формате это 11 0010
, сдвиг вправо на 4 дает 11
, что является равно 3.
См. документацию PHP и Википедию .
>> - это двоичный оператор сдвига вправо.
Ваш оператор сдвигает биты в числовом значении 50 на четыре позиции вправо. Поскольку все целые числа представлены в дополнении до двух , это равно 3. Легкий способ запомнить это: один сдвиг вправо равен делению на 2, а один сдвиг влево - это то же самое, что и умножение на 2.
Как описано на php.org , оператор >>
является оператором побитового сдвига, который сдвигает биты вправо:
$ a >> $ b - сдвиг биты $ a $ b шагов вправо (каждый шаг означает «деление на два»)
50 в двоичном формате составляет 110010
, а оператор >>
сдвигает эти биты 4 места в вашем примере кода. Хотя это происходит за одну операцию, вы можете представить себе несколько шагов, например:
00011001
00001100
00000110
00000011
Поскольку двоичный 11
равен 3
в десятичном виде, код выводит 3.
It's called a right shift. 'Биты левого операнда сдвигаются вправо на количество позиций правого операнда. Освободившиеся слева битовые позиции заполняются знаковым битом, а биты, сдвинутые вправо, отбрасываются."
Информацию об этом можно найти здесь: http://php.comsci.us/etymology/operator/rightshift.php
Сдвигает биты вниз на четыре позиции.
50 в двоичном формате - это 110010.
Сдвинутое на четыре места вниз равно 11, то есть 3.
Оператор >>
называется оператором двоичного сдвига вправо .
Сдвиг битов вправо 4 раза аналогичен делению на два, четыре раза подряд. Результатом в этом случае будет 3,125
. Поскольку 50 - это целое число, сдвиг битов вернет нижний предел этого значения, равный 3
.
Другими словами, 50
- это 0b110010
в двоичном формате. Сдвигая в 4 раза, мы получаем 0b11
, что равно 3
в десятичной системе.