что за операнд такой интересный "^" не в regex

S
На сайте с 25.08.2006
Offline
51
878

столкнулся со скриптом одним присутствует следующий код там

function mix($a, $b, $c)

{

$a -= $b;

$a -= $c;

$a ^= (zeroFill($c, 13));

return $a;

}

так вот на php 5.2.1 он работает неправильно

вот эта строка $a ^= (zeroFill($c, 13)); интересует что это тут за операнд такой "^="

именно он и глючит

есть идеи у кого ??

dkameleon
На сайте с 09.12.2005
Offline
386
#1

xor

$a = $a xor zeroFill()

Дизайн интерьера (http://balabukha.com/)
Коля Дубр
На сайте с 02.03.2005
Offline
153
#2
sergwm:
что это тут за операнд

Операнд - это то, над чем производится операция. А это - оператор :)

http://ru2.php.net/manual/ru/language.operators.assignment.php


or you could use the xor-assignment operator..
$a ^= $b;

По логике вещей должно быть равнозначно: $a = $a ^ $b;

^ - оператор побитового исключающего ИЛИ.

Гляньте еще вот это:

http://www.yaldex.com/wjscript/jsoprxorequ.htm

Разрабатываю общую шину (http://habrahabr.ru/company/floxim/blog/268467/) помаленьку. ...а еще у меня есть бложек (http://www.blogovo.ru/).
S
На сайте с 25.08.2006
Offline
51
#3

для примера

<?

$a = 4523419682;

$a = $a - 4608221683;

$a = $a - 4653896912;

$a ^= 43814;

?>

на 5.0.3 выдает -443704711

на 5.2.1 выдает -21474398348

не пойму что к чему :/

S
На сайте с 25.08.2006
Offline
51
#4

кароч понял ... нада пенать хостера пусть устанавливает нармальный релиз

Коля Дубр
На сайте с 02.03.2005
Offline
153
#5

К сожалению, под рукой нет нескольких версий PHP.

Протестил в JavaScript (FF), получилось -443704711 - т.е. похоже в PHP 5.2.1 действительно бага.

Проверьте, кстати, может дело именно в присвоении - посмотрите что покажет


echo -4738698913 ^ 43814;

Вы сделаете доброе дело, запостив багрепорт вот сюда:

http://bugs.php.net/report.php

:)

S
На сайте с 25.08.2006
Offline
51
#6

нашел саму траблу

раз побитовое. значит пробуем

decbin(-4738698913) - на выходе имеем 11100101100011010011000101011111

в а 5.2.1 на выходе получается 10000000000000000000000000000000

вот суть в этом ... не знаю как обозвать

а сама операция работает нармуль

<?

$a = -4738698913;

$b = 43814;

echo decbin($a) . "\n";

echo "xor\n";

printf("1%0" . (strlen(decbin($a)) - strlen(decbin($b)) - 1) . "s", "");

echo decbin($b) . "\n";

echo "=\n";

echo decbin($a ^ $b) . "\n";

/*

PHP 5.0.3 - Normal result

11100101100011010011000101011111

xor

10000000000000001010101100100110

=

11100101100011011001101001111001

PHP 5.2.1 - Bad result

10000000000000000000000000000000

xor

10000000000000001010101100100110

=

10000000000000001010101100100110

*/

?>

M
На сайте с 09.03.2007
Offline
3
mmh
#7

не бага это. и не от версии пхп зависит

все дело в битности процессора, на одном у тебя 32 бит, на другом 64 бит вот и вылезает

S
На сайте с 25.08.2006
Offline
51
#8

ну и на каком должен работать нармально ??

ничего что побитовые операции там тоже неправьльно выполняются

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий