![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 0 Dołączył: 28.12.2010 Ostrzeżenie: (0%) ![]() ![]() |
Witam
przegladalem forum ale takiego problemu nie znalazlem (w druga str bardziej:)) Problem jest taki: posiadam system 64 bitowy a przez to mam rozszerzony zakres inta. I teraz jak robie przesuniecie bitowe liczby, dajmy na to: CODE $zmienna = 1732584193<<5; var_dump($zmienna); wyswietla mi: CODE int(55442694176) a powinien(dla inta 32-bitowego): CODE -391880672 probowalem juz ustawiac CODE ini_set(PHP_INT_SIZE,4); ale to nic nie dalo, i funkcja (znalazlem w necie, typek twierdzi ze bangla) CODE function thirtyTwoBitIntval($value) { if ($value < -2147483648) { return -(-($value) & 0xffffffff); } elseif ($value > 2147483647) { return ($value & 0xffffffff); } return $value; } tez nie dziala poprawnie, tj ucina po prostu bity, nie interpretuje np jako liczba ujemna, a powinno... nie mam juz sily na to, macie moze jakis pomysl? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
Operacja przesunięcia bitowego jest zaimplementowana na poziomie procesora. Nie ma czegoś takiego, jak PHP_INT_SIZE w konfiguracji PHP. Jest to stała informacyjna.
Podana przez Ciebie funkcja znaleziona w sieci jest jak najbardziej poprawna. Twoje wątpliwości wynikają z tego, że nie rozumiesz, na czym polega przesunięcie bitowe: jest to ni mniej, ni więcej, tylko ucięcie bitów. A to że na systemach 32-bitowych dać nam to może liczbę ujemną, jest czystym przypadkiem wynikającym z tego, że najstarszy bit jest bitem znaku w kodzie uzupełnień do dwóch. W systemie 64-bitowym z definicji jest on położony dalej i jest to tylko INTERPRETACJA. Pod względem bitowym operacja jest POPRAWNA. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 0 Dołączył: 28.12.2010 Ostrzeżenie: (0%) ![]() ![]() |
A to to ja wiem ze jest poprawna. Wiem na czym polega przesuniecie bitow, nawet sobie recznie na kalkulatorze to robilem i wiem ze wyniki sie zgadzaja (IMG:style_emoticons/default/smile.gif) Chodzi mi tylko o to, zeby zasymulowac taki procesor 32-bitowy phpem, aby interpretacja, jak to ladnie ujales (IMG:style_emoticons/default/smile.gif) byla taka sama a nie wiem jak, podejrzewam ze posiadasz wieksza wiedze na ten temat ode mnie i moglbys cos podpowiedziec (IMG:style_emoticons/default/smile.gif)
Ten post edytował Safek 11.05.2011, 13:14:29 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 0 Dołączył: 28.12.2010 Ostrzeżenie: (0%) ![]() ![]() |
stuningowalem lekko ta funkcje znaleziona w necie i wyglada teraz tak:
to rozwiazalo problem (przynajmniej w wiekszosci przypadkow (IMG:style_emoticons/default/smile.gif) ) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 20:34 |