Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Pytanie. W jakim celu stosuje się zapis & 0xFFFF?
Konfucjusz
post 12.11.2009, 22:18:47
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 12.11.2009

Ostrzeżenie: (0%)
-----


Witam serdecznie.

Mam do Was pytanie dotyczące pewnego zapisu.
Chciałem zmienić w komponencie Virtuemart (Joomla) sposób wyświetlania się pewnych jednostek (konkretnie ilość towaru w paczce).

Oryginalnie jednostki te były wyświetlane jako liczby całkowite, a ja chciałem je wyświetlić jako liczby dziesiętne.

Naturalnie, po kilku zmianach w bazie danych i drobnych przeróbkach w kodzie udało mi się tego dokonać, jednakże w kodzie natrafiłem na pewien zapis, którego niestety nie rozumiem i liczę ,że ktoś z Was mi go wyjaśni.

Niestety, na początku, mimo, zmian w bazie itd (typ kolumny product_packaging zmieniłem z INT na DEZIMAL(10,2) ) dalej pokazywało mi liczbę całkowitą.

Dopiero usunięcie w kodzie zapisu & 0xFFFF

Oryginalny zapis był taki
  1. $db->f("product_packaging") & 0xFFFF;


po zmianach taki

  1. $db->f("product_packaging");

pomogło,

W jakim celu stosuje się tutaj ten zapis (& 0xFFFF) i czy usunięcie jego będzie miało/ma jakis wpływ na działanie skryptu.

Ogólnie po zmianach wszystko działa , tylko właśnie nurtuję mnie to że bez powodu tego tam nie wstawili smile.gif

Dzieki za jakiekolwiek wyjaśnienie

Pozdrawiam






Go to the top of the page
+Quote Post
blooregard
post 12.11.2009, 22:38:51
Post #2


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




& - to logiczne AND. Operator ten słuzy do wykonania logicznego działania AND na dwóch podanych argumentach (nie myl z &&).
AND ustawia wynikowy bit na jeden tylko wtedy gdy oba bity w podanych argumentach również mają wartość 1.

Przykład: 11 & 10 = 10.

Czemu?
Binarnie liczba 11 to 01011, liczba 10 to 01010.
Dokonując na tych dwóch liczbach operacji AND:

binarnie: 01011 | dziesiętnie: 11
AND
binarnie: 01010 | dziesiętnie: 10
=
binarnie: 01010 | dziesiętnie: 10 (ustawiamy odpowiedni bit na 1 jedynie tam, gdzie oba bity w podanych liczbach miały 1)

Prosty skrypt do testowania:
  1. <?php
  2. $a = 100;
  3. $b = 50;
  4.  
  5. echo "wynik operacji $a & $b = " . ($a & $b);


A u Ciebie:
  1. $db->f("product_packaging") & 0xFFFF;

dokonywana jest logiczna operacja AND na wartośc zwracanej przez metodę $db->f() dla argumentu "product_packaging" (pewnie jakaś wartość liczbowa odczytywana z tablicy asocjacyjnej dla zadanego klucza albo z bazy danych dla pola/kolumny o takiej nazwie) oraz liczby 65536 (bo dziesiętnie 0xFFFF to właśnie 65536 zapisane hexadecymalnie).


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
antyqjon
post 12.11.2009, 22:58:27
Post #3





Grupa: Zarejestrowani
Postów: 77
Pomógł: 27
Dołączył: 24.03.2002
Skąd: Tarnów

Ostrzeżenie: (0%)
-----


Cytat(blooregard @ 12.11.2009, 22:38:51 ) *
(bo dziesiętnie 0xFFFF to właśnie 65536 zapisane hexadecymalnie).

O jeden mniej winksmiley.jpg


--------------------
Zbyszek 'antyqjon' Siciarz

siciarz.net | Aquila DSP C++
Go to the top of the page
+Quote Post
blooregard
post 12.11.2009, 23:08:36
Post #4


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Cytat
O jeden mniej

Racja. 65535 (licząc od 0) smile.gif . W sumie 65536 możliwych wartości.


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
Konfucjusz
post 13.11.2009, 00:11:00
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 12.11.2009

Ostrzeżenie: (0%)
-----


Dzięki @blooregard za słowa wyjaśnienia, o istnienu operatorów bitowych w PHP kompletnie zapomniałem smile.gif

Tylko w jakim celu zastosowano tutaj iloczyn bitowy, zwłaszcza, że są pewnie niektórzy użytkownicy VM, którzy również chcieliby przedstawić swoje jednostki w formie liczby dziesiętnej np: 1,5 (m2)

niestety np:
  1. <?php
  2.  
  3. $a = 2.5;
  4.  
  5. echo $a & 0xFFFF;
  6.  
  7. ?>

daje nam 2 smile.gif

naturalnie , jak juz wcześniej wspomniałem usunięcie 0xffff pomaga, ale chciałbym być w zgodzie z "oryginałem"
Czy można wogóle stosując iloczyn bitowy & (liczba dziesiętna z jakąś inna liczba heksadecymalną) mieć w wyniku liczbę decymalną/dziesietną ?

Ten post edytował Konfucjusz 13.11.2009, 00:45:14
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 6.05.2025 - 06:56