Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Operatory bitowe i definicje
Seth
post 29.04.2006, 15:18:22
Post #1





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

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


Ciezko zadac jedno pytanie bez przedstawienia tego co juz mam, wiec zaczne od poczatku:


Wpadlem na pomysl ujednolicenia kilku metod w mojej klasie i zrobienia z niej jednej.
Do tej pory mialem takie metody jak:
Cytat
sendErrorMsg()
sendActivationMsg()
sendFailureMsg()


...a obecnie:
Cytat
sendMsg($flag)


gdzie $flag to wartosc jednej z definicji ponizej:
  1. <?php
  2. define('MSG_ERROR', 1);
  3. define('MSG_ACTIVATION', 2);
  4. define('MSG_FAILURE', 4);
  5. ?>


Jezeli chce wyslac wiadomosc typu MSG_ERROR to daje:
sendMsg(ERROR_MSG);
(Wczesniej dawalem zamiast tego sendErrorMsg())

I wszystko ladnie pieknie bo wewnatrz medoty sendMsg() mam switcha, ktory robi mniej wiecej tyle:

  1. <?php
  2. ...
  3. switch ($flag) {
  4.  case MSG_ERROR:
  5. $msg .= 'jakis tam error';
  6. break;
  7.  case MSG_ACTIVATION:
  8. $msg .= 'jakis tam activation';
  9. break;
  10.  case MSG_FAILURE:
  11. $msg .= 'przykro mi tongue.gif';
  12. break;
  13. }
  14. ...
  15. // (tutaj kod, ktory sie powtarzal w metodach send*Msg())
  16. ...
  17.  
  18. ?>


Ale.... chce miec mozliwosc przeslania "kilku wiadomosci" czyli chce moc zrobic tak:
sendMsg(MSG_ERROR | MSG_ACTIVATION);
itp.

Tylko, ze nie wiem jak to obsluzyc w switchu. Bo za pomoca IFa moge np zorientowac sie czy mam jakas z wiadomosci (MSG_*) np tak:
  1. <?php
  2. if ($flag & MSG_ERROR) ...
  3. ?>


Ale czy rzeczywiscie trzeba pisac mase if'ow do tego? Czy nie da sie jakos switcha skonstruowac tak aby zadzialalo z takim zlozeniem flag?

Ten post edytował Seth 29.04.2006, 15:19:30
Go to the top of the page
+Quote Post
FiDO
post 29.04.2006, 17:40:49
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

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


switch z zalozenia wykonuje tylko jedna z opcji (pomijajac fakt, ze mozna nie napisac break'a, ale w tym przypadku sie to nie przyda), wiec raczej ciezko to widze bez if'ow. Ewentualnie mozna sprobowac zrobic petle po wszystkich flagach, wtedy moglbys miec switcha, tylko ze w kazdym case'ie musialbys usuwac wlasnie "wykonana" flage, zeby nie wszedl kilka razy do tego samego.
Troche to na sile, ale jak koniecznie chcesz switcha to jest to jakis pomysl winksmiley.jpg


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
Hacker
post 29.04.2006, 18:19:06
Post #3





Grupa: Zarejestrowani
Postów: 225
Pomógł: 0
Dołączył: 1.11.2005

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


albo wygodniej (jeżeli flag (nie: flagów) jest bardzo dużo) też można za pomocą tablicy w której trzymasz to co dodajesz w kolejności od tego czemu odpowiada 1 poprzez 2, 4, 8 itd. i robisz pętle
  1. <?php
  2.  
  3. $t=1;
  4. for($i=0; $i<count($tablica); $i++, $t*2)
  5. {
  6. if (($flag & $t) == $t)
  7. {
  8. $msg .= $tablica[i];
  9. }
  10. }
  11. ?>


----------
--
poprawilem blad
, a drugiego('poptez') nie znalazłeś tongue.gif (Hacker)
dr_bonzo


Ten post edytował Hacker 30.04.2006, 08:59:24


--------------------
(\.../)This is Bunny
(O.o)Copy Bunny into your signature to help him...
(> <)...on his way to world domination
Go to the top of the page
+Quote Post
orson
post 30.04.2006, 17:41:56
Post #4





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

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


witam ...

może być jeden switch ale musi być w pętli ...
  1. <?php
  2.  
  3. switch (true){
  4.  case ($flag & MSG_ERROR):
  5. $flag -= MSG_ERROR
  6.  case ($flag & MSG_ACTIVATION):
  7. }
  8.  
  9. ?>

itp ... ale za każdym razem musisz odjąć stałą od flagi ...

poza tym możesz spróbować jakoś z logicznym and żeby sprawdzić jakie przyszły ale to też jakoś z pętlą ...

pozdrawiam


--------------------
Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
Go to the top of the page
+Quote Post
em1X
post 2.05.2006, 09:48:38
Post #5





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


  1. <?php
  2.  
  3. define('ADMIN',8);
  4. define('MOD', 4);
  5. define('USER', 2);
  6. define('LEECH', 1);
  7. $perms = array('ADMIN'=>8,'MOD'=>4,'USER'=>2,'LEECH'=>1);
  8.  
  9. $user = MOD | USER;
  10.  
  11. foreach ($perms as $key => $val)
  12. {
  13. if (rights($user, $val))
  14. echo "I am $key<br />";
  15. else
  16. echo "I am not $key<br />";
  17. }
  18.  
  19. function rights($u, $perm)
  20. {
  21. if (!($u & $perm))
  22. return false;
  23.  
  24. return true;
  25. }
  26. ?>


output:

Kod
I am not ADMIN
I am MOD
I am USER
I am not LEECH


Ten post edytował em1X 2.05.2006, 09:50:36


--------------------
eh, co polska wódka to polska wódka
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: 25.07.2025 - 09:12