|
|
|
|
<?php
$a = 1 <<30;
var_dump(+$a+$a-$a-$a);
var_dump(-$a-$a+$a+$a);
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(17.05.2007 в 13:05)
| | занятно... | |
|
|
|
|
|
|
|
для: mefestofel
(17.05.2007 в 13:43)
| | var_dump($a) получается int(1073741824)
что делает <<30 ? | |
|
|
|
|
|
|
|
для: EXP
(17.05.2007 в 15:33)
| | сдвигает первый аргумент на 30 битов влево.
Это как раз не секрет. | |
|
|
|
|
|
|
|
для: Trianon
(17.05.2007 в 13:05)
| | Получается что +$a+$a - это четырехбайтовое целое, равное + 2147483648
-$a-$a - это четырехбайтовое целое равное -2147483648
границы этого типа данных: -2 147 483 648...+2 147 483 647
Соответственно при превышении ...значения + 2 147 483 647, у нас это + 2147483648, происходит преобразование типа в четырехбайтовое вещественное. Хотя по логике такого не должно быть. | |
|
|
|
|
|
|
|
для: mefestofel
(17.05.2007 в 17:48)
| | четырехбайтовое целое не может быть равно +2147483648
в остальном всё верно. | |
|
|
|
|
|
|
|
для: Trianon
(17.05.2007 в 17:53)
| | > четырехбайтовое целое не может быть равно +2147483648
конечно, я думаю Вы поняли что я описался, т.к. ниже указаны границы четырехбайтового целого... ;-) | |
|
|
|
|
|
|
|
для: Trianon
(17.05.2007 в 17:53)
| | для шестнадцатеричных тоже самое.
<?php
var_dump(0x80000000);
?>
|
| |
|
|
|
|
|
|
|
для: mefestofel
(18.05.2007 в 05:43)
| | зачем сдвигать что то и что это дает | |
|
|
|
|
|
|
|
для: bronenos
(18.05.2007 в 07:32)
| | >зачем сдвигать что то и что это дает
Не знаю как разнится в РНР, но бывает, что гораздо быстрее произвести логический сдвиг числа, чем делить его. | |
|
|
|
|
|
|
|
для: sim5
(18.05.2007 в 11:58)
| | >>зачем сдвигать что то и что это дает
>
>Не знаю как разнится в РНР, но бывает, что гораздо быстрее произвести логический сдвиг числа, чем делить его.
Именно в php разница разительная.
<?php
$a = 268435466 ;
echo "<br>a= $a";
$b = $a <<4;
$c = $a *16;
echo "<br>b= a<<4 = $b";
echo "<br>c= a*16 = $c";
$d = $b/64;
$f = $b>>6;
echo "<br>d= b/64 = $d ";
echo "<br>f= b>>6 = $f ";
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(18.05.2007 в 12:49)
| | Я хотел сказать не о точности (понятное дело что это не всегда оправдано), а о скорости выполнения операций деления и логического сдвига. Исходя из логики работы процессора, логический сдвиг, операция быстрее - данные в акумуляторе сдвигаются через флаговый регистр нужное число раз и все, операция деления это несколько сложнее процесс...
Отражается ли это на скорости выполнения этих операций в РНР, вот этого я не знаю :) | |
|
|
|
|
|
|
|
для: sim5
(18.05.2007 в 13:34)
| | Так и я говорю не о точности. Оперируя целыми, о точности уже не говорят. Просто на обычных четырех действиях арифметики движок php отказывается оперировать целыми. Я говорю именно об этом отказе.
А скорость несложно померять.... Но думаю, результат будет в пользу сдвигов отнюдь не из-за простоты схемной реализации, а просто потому, что не придется преобразовывать аргументы к вещественному типу. | |
|
|
|
|
|
|
|
для: Trianon
(18.05.2007 в 13:45)
| | $b = $a <<4 // =160
Значит сдвиг в РНР происходит без учета переноса, в противном случае должно получится 168. | |
|
|
|
|
|
|
|
для: sim5
(18.05.2007 в 14:21)
| | Он в любом языке (где лексема << обозначает сдвиг) таким происходит .
В С, С++, Java, JS, C#(в конечном итоге)
Во всех этих языках он превращается в инструкцию shl (в терминах Intel)
В том числе (в конечном итоге) и в PHP | |
|
|
|
|
|
|
|
для: Trianon
(18.05.2007 в 14:42)
| | Ну значит будем считать, что авторы вышеперечисленного, посчитали ненужным этот бит :)
Я по крайней мере не знаю куда он исчезает.
Даже в микроконтроллерах - при простом циклическом сдвиге крайний бит будет перходить на место бита 0 или 7, в зависимости от направления сдвига. Если сдвиг производить командой учитывающей перенос (через флаг переноса), то это позволяет в 8-разрадных процессорах производить лог. сдвиги многобайтовых чисел.
Куда исчезает бит в РНР? | |
|
|
|
|
|
|
|
для: sim5
(18.05.2007 в 15:05)
| | и в микроконтроллерах и в микропроцессорах, как правило, есть не только команды циклического сдвига (ROL/ROR), но и обычного логического (SHL/SHR), а иногда и арифметического (SAR)
Флаг переноса в них входным операндом не является.
А в реализациях компиляторов для тех архитектур, где таких команд нет, перед ROL добавляют CLC (CLear Carry/borrow flag bit) | |
|
|
|
|
|
|
|
для: Trianon
(18.05.2007 в 15:15)
| | Логический сдвиг для микроконтроллеров - это всетаки не правило, он может отсутствовать :(
Ну главное ясна причина потери бита! :) | |
|
|
|