как отменить эту операцию? - PullRequest
0 голосов
/ 15 мая 2010
<?php

echo (2884284 >> 16), '<br>'; // = 44

echo ((2884284 >> 16) & 0xFFFF), '<br>'; // 44

из вышесказанного я получил 44

так, как я могу получить от 44 до 2884284 ???

Ответы [ 2 ]

9 голосов
/ 15 мая 2010

Ты не можешь. Вы уничтожаете данные, выполняя сдвиг.

3 голосов
/ 15 мая 2010

Чтобы расширить на mhughes ответ:

2884284 в двоичном виде:

1011000000001010111100

Когда вы сдвигаетесь вправо, биты справа обрезаются, а биты слева заполняются 0. Итак, 2884284 >> 16 становится:

0000000000000000101100

... который, как вы упомянули, равен 44. Обратите внимание, что это то же самое, что деление на 2 ^ 16 и округление вниз. Операция реверса << или сдвиг бит влево. Он обрезает биты слева и заполняет биты справа нулями. Но 44 << 16 это:

1011000000000000000000

... то есть вы потеряли данные из усеченных битов. Это число 2883584, что может быть достаточно близко. Обратите внимание, что это то же самое, что умножение на 2 ^ 16.

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