![]() |
![]() |
![]()
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 7.10.2025 - 03:48 |