Skocz do zawartości

Operatory binarne


Erbit

Rekomendowane odpowiedzi

Hellz - w wolnej chwili podesle Tobie na PW linki do tego sktyptu na 2 serwerach. Calosci kodu nie ma sensu wklejać, wkleje tylko jego najwazniejszy element powiązany z tym zagadnieniem a na wskazanych adresach zobaczysz efekty. Za moment wstawie kod.

stawiam na tolka banana...

Dziekuje za linka - już sobie czytam.. tez tak się zastanawiałem nad tym problemem - dlatego tez w pierwszym poscie napisalem o 2 roznych procesorach. Z tego co pamiętam pierwszy procesor to (chyba) 32 bitowy a drugi 64ro bitowy - sprawdzę to dokładnie.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 38
  • Dodano
  • Ostatniej odpowiedzi

Aaa widzisz. Na jednym typ int moze byc 32bit, a na drugim 64bit. Ja caly czas zgaduje, bo nie znam fizycznej interpretacji liczb w PHP. Ale podejrzewam, ze rowna do dlugosci rejestru. Sprobuj "przekrecic" licznik na jednym i drugim przy 32-bitowej liczbie.

Oficjalna strona serii Football Manager ( FM 2005, FM 2006 ) - CM Revolution

Forza MLKS Woźniki Śląskie!

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...

Dziekuje - wszystkie sugestie są dobre...

z tego co widzialem - wszystkie bugi opierają sie na zmienie typu zmiennej (rzutowaniu) a to juz testowalem...

Niemniej link ciekawy - poszperma jeszce - dzieki !

i niby rozwiązanie jest tu -> https://bugs.php.net/bug.php?id=6260

Problem tylko w tym, że:

1. nie wszędzie na serwerach stosowanan jest wspomniana biblioteka bcmath (a zarazem gmp_xor)

2. mam serwer gdzie nie ma wspomnianej biblioteki a mimo to wyliczenia są poprawne.

Odnośnik do komentarza
Udostępnij na innych stronach

o dobrze ze odswiezyliscie ten topic bo inaczej bym do niego pewnie nie zawital :) Tez mam taki problem, wlasnie z operatorem XOR przy obliczaniu checksumy, robie tak jak erbit czyi oliczam na 32bitowej maszynie i zasysam na 64bitowa ;)

Rozumiem ze trzeba sobie samemu napisac funkcje xor ? Ehh..Bo takie rozwiazanie przetrzucania maszynami jest tylko na krotka mete..Hmm..a moze jednak tu chodzi o to zeby zaminiac z tego big endian do little endian ? Bede musial pokombinowac przy tym :)

:)

pozycjonuj.png
Odnośnik do komentarza
Udostępnij na innych stronach

Bede musial pokombinowac przy tym :)

Ok.. jak znajdziesz rozwiazanie - daj znac.. ja tez bede szukał - dzis połowę dnia przeszperałem za tym i na razie nic... ale czuję, że juz jestem bliski rozwiązania - poprostu kończą sie możliwości.

W najgorszym wypadgo własną funkcję xor napiszę.

Odnośnik do komentarza
Udostępnij na innych stronach

ok. znalazlem roznice na czym sie wyklada.

mamy fragment kodu (pierwsza linijka w funkcji mix zdaje sie):

$t=(zeroFill($b,13));

$c ^= $t;

u mnie gdy wywoluje checksume dla 'testownik' (bez info:), mam liczby:

$t=471472;

$a=-3677427556;

binarnie to wyglada tak:

na maszynie 32-bitowej:

t = 1110011000110110000

a = 100100110011101110100010011100

natomiast na 64bitowej:

t = 1110011000110110000

a = 10000000000000000000000000000000

Czyli problem lezy w tym ze inaczej zapisuje duze liczby ujemne, na maszynie 32-bitowej licznik sie "przekrecil" bo max to chyba -2147483648, teraz pytanie jak to "przekrecic" licznik na maszynce 64 bitowej ;)

:)

pozycjonuj.png
Odnośnik do komentarza
Udostępnij na innych stronach

w dokumentacji php widzialem gdzies (niestety nie pamietam gdzie i mam nadzieje, ze nie wprowadzam siebie i was w blad ) ze int w php jest zawsze typu long czyli 64 bitowy niezaleznie od maszyny.

Zdaje sie, ze phppowinien byc przenosny i niezalezny od maszyny wiec jesli jest to jest to bug

ale cos mi sie nie widzi zeby w tylu wersjach go niewyeliminowali.

PS.moze sprobujcie zcastowac zmienne do int przed xorowaniem.

Odnośnik do komentarza
Udostępnij na innych stronach

papieros: zcastowac? :-) Czyli ze co ? :-)

czyli poinformowac interpreter ze chodzi o zmienne typu int byc moze domyslnie podstawia sobie 'najmniejsze/najkrotsze' mozliwe .

w C to sie robi przez (int) w php zdaje sie przez funkcje intval

ja bym sprobowal:

$a=intval( 1001901929 );

$b=intval( 19832198381 );

$c=$a^$b; //wynik powinien byc tez int jesli nie zadziala tomoze przed ta linia dac $c=intval(0);

ps.nie wgryzlem sie dokladnie w temat to zostawiam testy tym co sie wgryzli.

ps2: wartosci w intval machnalem oczywiscie przypadkowe

Edyta:

Wycofuje sie z tego co napisalem wczesniej int jest zawsze typu long ale long jest 32 bitowy na 32 bitowych maszynach i 64 bitowy na 64 bitowych wiec castowanie raczej nc nie da. Zamieszalem. Sorry.

PS Dla dlugich slow pozostaje sprawdzac dlugosc slowa procesora i napisac odpowiednia funkcje to chyba nie takie trudne.

Odnośnik do komentarza
Udostępnij na innych stronach

a no juz rozumiem, chodzi o rzutowanie zmiennych :-) To juz probowalem tylko wlasnie problem polega na tym ze to nic nie daje bo w php nie mamy zadnego long int itd tylko jest jedno int ktore na jednych maszynach jest 32 bitowe a na innych 64 bitowe :-) Mozliwe ze to poprostu jest wina nie samego php tylko np. jadra linuxowego. Tak jak mowilem problem istnieje chyba tylko dla duzych liczb ujemnych wiec postanowilem "przekrecac" na wlasna reke te zmienne, oto wersja na maszyny 64bitowe - nie wiem czy w kazdym przypadku ale pare testowych danych wpisalem i podawal taka sama checksume jak na 32bitowej maszynie:

nowa wersja funkcji mix:

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

{

$a -= $b; $a -= $c; $t=(zeroFill($c,13));

$a=przekrec($a); $t=przekrec($t); $a ^= $t;

$b -= $c; $b -= $a; $t=($a<<8);

$b=przekrec($:); $t=przekrec($t); $b ^= $t;

$c -= $a; $c -= $b; $t=(zeroFill($b,13));

$c=przekrec($c); $t=przekrec($t); $c ^= $t;

$a -= $b; $a -= $c; $t=(zeroFill($c,12));

$a=przekrec($a); $t=przekrec($t); $a ^= $t;

$b -= $c; $b -= $a; $t=($a<<16);

$b=przekrec($:); $t=przekrec($t); $b ^= $t;

$c -= $a; $c -= $b; $t=(zeroFill($b,5));

$c=przekrec($c); $t=przekrec($t); $c ^= $t;

$a -= $b; $a -= $c; $t=(zeroFill($c,3));

$b=przekrec($B); $t=przekrec($t); $a ^= $t;

$b -= $c; $b -= $a; $t=$a<<10;

$b=przekrec($B); $t=przekrec($t); $b ^= $t;

$c -= $a; $c -= $b; $t=(zeroFill($b,15));

$c=przekrec($c); $t=przekrec($t); $c ^= $t;

return array($a,$b,$c);

}

function przekrec($n)

{

if($n<-2147483648) $n=$n+4294967296;

return $n;

}

Prosze przetestowac czy dziala ;)

:)

pozycjonuj.png
Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności