Můžete mi vysvětlit výpočet?

none_

Re:Můžete mi vysvětlit výpočet?
« Odpověď #15 kdy: 10. 01. 2014, 17:06:19 »
ee, ten tvůj předpoklad je špatně. Ta dvojka je tam kvůli tomu, že v binární soustavě se počítá vždycky s mocninami dvou a víš, že když dáš 2 na nějaký číslo, tak ti vyjde číslo, který bude mít v binární soustavě jedničku a pak samý nuly. Takže podle toho hledá, jestli na X pozici (počítáno od 0) je 1.

Je na druhé (počítáno od nuly) pozici čísla 1000100 jednička?
$bool = 1000100 & pow(2,2) = 1000100 & 100(to je 4) = 100 = 4
takže $bool > 0 --> ano, na druhé pozici je 1.

Tři stavy tady u toho nikdy mít nemůžeš, protože binární čísla znají jen 0 nebo 1. Tzn. buď zapnuto nebo vypnuto nějaké oprávnění. Každopádně pokud potřebuješ nějaké specifičtější oprávnění např: může editovat stránku a zároveň může všechno číst, tak se může dotazovat na dvě pozice a povolit aby něco udělal jen, když bude mít na obou pozicích 1.

Obecně takhle můžeš uložit jen věci typu true/false, popřípadě true/false && true/false, ale to už psal Ziktofel...:)


none_

Re:Můžete mi vysvětlit výpočet?
« Odpověď #16 kdy: 10. 01. 2014, 17:11:51 »
Popřípadě, pokud opravdu potřebuješ pro něco 3 stavy (což nebude asi ale případ u oprávnění), tak musíš použít něco jiného. Nějakou složitější strukturu. Teoreticky bys mohl použít trojkovou soustavu a pak by ty čísla vypadala třeba takhle: 21020120221. Ale to už mi přijde jako dobrej guláš a hrozí, že za týden narazíš na problém, že potřebuješ 4 stavy a budeš tam, kdes byl předtím.

j

Re:Můžete mi vysvětlit výpočet?
« Odpověď #17 kdy: 10. 01. 2014, 17:31:36 »
Obecne se na vice stavu pouzije vice bitu ...

Jinak se celymu postupu rika taky maskovani.

10001001 .... je rekneme hodnota, zajimaj me bity 2,4,5 =>
00110100 ... je maska

A ted uz se na to postve jen spravna logicka operace, v zavislosti na tom, jaky vysledek hledam. Trebas pokud na to postvu AND .. tak zjistim, ze ani jeden z pozadovanych bitu neni nastaven => vysledek je 0 => false.

Petr

Re:Můžete mi vysvětlit výpočet?
« Odpověď #18 kdy: 10. 01. 2014, 18:27:41 »
Popřípadě, pokud opravdu potřebuješ pro něco 3 stavy (což nebude asi ale případ u oprávnění), tak musíš použít něco jiného. Nějakou složitější strukturu. Teoreticky bys mohl použít trojkovou soustavu a pak by ty čísla vypadala třeba takhle: 21020120221. Ale to už mi přijde jako dobrej guláš a hrozí, že za týden narazíš na problém, že potřebuješ 4 stavy a budeš tam, kdes byl předtím.
z techto duvodu je lepsi volit soustavu o zakladu alespon 50 :) Ano, uz to potom sice nenarves do integeru, ale i tak - na definici pristupovych prav k objektu potom staci bohate nejakej varchar(8) - s tim, ze muzes samozrejme pouzivat i skupiny, namisto jednotlivych uzivatelu (staci pridat bitovy flag).
Ackoliv mi tahle technika prisla dost obskurni, tak je dost efektivni a na zadnej lepsi zbusob, jak ukladat usporne ACL do DB jsem neprisel :o

Lol Phirae

Re:Můžete mi vysvětlit výpočet?
« Odpověď #19 kdy: 10. 01. 2014, 18:31:59 »
Pokud si projdeš kód phpBB, tak tam pokud si dobře pamatuju používají podobnou šílenost.


webhope

Re:Můžete mi vysvětlit výpočet?
« Odpověď #20 kdy: 10. 01. 2014, 18:38:25 »
Už mi to začíná být jasný  :) Takže i když jsou nebo budou ty volby uložené pod nějakým desítkovým číslem, tak si to nejdříve musím převést na binární číslo a provést binární operaci, nebo to mohu provést pomocí binárního násobení ... o & pow(2,y) ...

Otázka ale je: v jakém směru čtete ty pozice, zleva doprava nebo zprava doleva :) ? Já to čtu zprava doleva.

Petr: Na termín ACL jsem tam taky narazil. No vida.

Lol Phirae: PHPBB nepoužívám, ale třeba někdy v budoucnu se na to podívám.

Re:Můžete mi vysvětlit výpočet?
« Odpověď #21 kdy: 10. 01. 2014, 18:49:22 »
Ziktofel:
Citace
jinak obvykle na to narazis asi tam, kde mas pole booleanu a potrebujes ho napsat jako jeden int (coz se muze hodit treba pro ulozeni do db)
Nad něčím takovým jsem uvažoval, že bych to mohl udělat, a říkal jsem si jestli by to šlo pak použít pro "vyhledávač" (do html formuláře zadáš konkrétní bolean hodnoty pomocí input checkbox, a pak bych provedl nějakou operaci, která by tu boolean hodnotu vytáhla (např. z mysql databáze nebo z datového souboru). Ale nevím jak se takové věci (bitové porovnávání) dělají v praxi. Takže registrovaní uživatelé s id 0, 1, 2, 3 si uloží 4 volby v nastavení v hodnotách např 1001 (první uživatel),  1101, 0100, 0101 (poslední uživatel). A pak chci hledat nějakého uživatele, který má první a třetí bit zapnutý (nebo naopak, první nebo třetí)... tak jak to udělat... To by mě taky zajímalo.
Jestli můžu doporučit, tak se podívej nejprve na to,
  • co je to bit a byte
  • jak se převede číslo z desítkové soustavy do dvojkové soustavy a zpět
  • co to jsou bitové oprace
Nemyslím to nijak ironicky, ale určitě se ti to bude hodit. Tak například pokud hledáš uživatele, který má "zapnutý první a třetí bit", tak to uděláš pomocí bitového součinu s číslem 0b101 ( PHP 5.4+ )

Re:Můžete mi vysvětlit výpočet?
« Odpověď #22 kdy: 10. 01. 2014, 19:02:26 »
Citace
, který má "zapnutý první a třetí bit",
Taky bych si to mohl přečíst než to pošlu  ::)  To měla být ta druhá varianta "zapnutý první nebo třetí bit"

Tomix nologin

Re:Můžete mi vysvětlit výpočet?
« Odpověď #23 kdy: 11. 01. 2014, 08:30:33 »
Citace
Taky bych si to mohl přečíst než to pošlu  ::)  To měla být ta druhá varianta "zapnutý první nebo třetí bit"

Není to spíš nultý a druhý?

Radovan.

Re:Můžete mi vysvětlit výpočet?
« Odpověď #24 kdy: 11. 01. 2014, 10:08:51 »
Takže i když jsou nebo budou ty volby uložené pod nějakým desítkovým číslem, tak si to nejdříve musím převést na binární číslo ...
Ale nemusíš, ty už to v počítači převedené máš, protože jinou než dvojkovou soustavu ta "relátka" neumějí ;-)

Jinak už je příklad výš, jen ho trochu doplním:
10001001 .... je rekneme hodnota, zajimaj me bity 2,4,5 =>
00110100 ... je maska
---------------------------
00000000 ... je výsledek, protože při & (AND neboli logický součin) jednička vyjde jen tam, jde jsou bity v obou číslech jedničkové


A v jiném případě:
10001001 .... je stejná hodnota, zajímají mě tentokrát nejnižší čtyři bity, tedy 0 až 3 =>
00001111 ... je maska
---------------------------
00001001 ... je výsledek, který si můžeš klidně z hlavy převést na desítkové číslo: 8+1=9


Bity neboli dvojkové číslice se berou ve stejném pořadí jako ty naše desítkové, tedy s nejnižší hodnotou vpravo.

Ještě bys tam mohl mít |, neboli OR - logický součet, který dá jedničku tam, kde je aspoň jeden z bitů obou čísel jednička:
10001001 .... je zase stejná hodnota, zajímají mě opět nejnižší čtyři bity, tedy 0 až 3 =>
00001111 ... je stejná maska
---------------------------
10001111 ... a výsledek si stejně snadno jako v minulém případě převedeš z hlavy na desítkové číslo: 128+8+4+2+1=143


Ještě poznámka o tom proč se bity číslují (zprava) 0 až 7, je to proto že jejich hodnota odpovídá příslušné mocnině dvojky:
27 = 128
26 = 64
25 = 32
24 = 16
23 = 8
22 = 4
21 = 2
20 = 1

A u dvaatřicetibitového čísla bys takhle samozřejmě pokračoval až do 231.

webhope

Re:Můžete mi vysvětlit výpočet?
« Odpověď #25 kdy: 11. 01. 2014, 11:24:15 »
Díky všem, kromě pana Curiouse, za pomoc. Už to chápu a používám to ve své nové metodě. Je to geniální.

Re:Můžete mi vysvětlit výpočet?
« Odpověď #26 kdy: 11. 01. 2014, 12:02:55 »
Jistě, že to je geniální. Když programátor objeví bitové operace, je to jako když mechanik objeví šroubovák.

webhope

Re:Můžete mi vysvětlit výpočet?
« Odpověď #27 kdy: 12. 01. 2014, 10:13:44 »
turista: nejsem programátor, jsem jen turista  ;D