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

webhope

Můžete mi vysvětlit výpočet?
« kdy: 10. 01. 2014, 15:23:42 »
Narazil jsem na jeden kód matematický vzorec v kódu (php) a nemůžu pochopit jak to funguje.
Funkce má několik vstupních proměnných, ke vzorci se vztahuje $fld_acs, což je přirozené číslo.
Proměnná global se vyskytuje ve tvou variacích. Zde uvádím jen tu první variaci, tu druhou se mi už nechtělo počítat. fld_acs nějakým způsobem určuje přístup k poli (jestli se proměnná bude zobrazovat či nikoliv na výstupu).
vzorec:

Kód: [Vybrat]
$bool =  $global & pow(2,$fld_acs); 
Moje propočty:
Kód: [Vybrat]
2146413821 & 2^0 = 2146413821 & 1 = 1
2146413821 & 2^2 = 2146413821 & 4 = 4
2146413821 & 2^3 = 2146413821 & 8 = 8
2146413821 & 2^4 = 2146413821 & 16 = 16
2146413821 & 2^5 = 2146413821 & 16 = 32
2146413821 & 2^6 = 2146413821 & 32 = 64
2146413821 & 2^7 = 2146413821 & 128 = 128
2146413821 & 2^8 = 2146413821 & 256 = 0
2146413821 & 2^9 = 2146413821 & 512 = 0
2146413821 & 2^10 = 2146413821 & 1024 = 1024
2146413821 & 2^11 = 2146413821 & 2048 = 2048
2146413821 & 2^12 = 2146413821 & 4096 = 0
2146413821 & 2^13 = 2146413821 & 8192 = 8192
2146413821 & 2^14 = 2146413821 & 16384 = 0
2146413821 & 2^15 = 2146413821 & 524288 = 524288
2146413821 & 2^16 = 2146413821 & 1048576 = 1048576
2146413821 & 2^17 = 2146413821 & 2097152 = 2097152
2146413821 & 2^18 = 2146413821 & 2097152 = 4194304
2146413821 & 2^28 = 2146413821 & 8 = 268435456

Jelikož nechápu jak funguje operátor & tak mi není jasné proč je někdy výsledek 0. Vysvětlí někdo?


3ugeene

Re:Můžete mi vysvětlit výpočet?
« Odpověď #1 kdy: 10. 01. 2014, 15:26:17 »
and je logický součin - pokud jsou bity na stejných pozicích v obou číslech 1, bit výsledku na dané pozici je taky 1

none_

Re:Můžete mi vysvětlit výpočet?
« Odpověď #2 kdy: 10. 01. 2014, 15:42:53 »
Kód: [Vybrat]
$bool =  $global & pow(2,$fld_acs); 
Moje propočty:
Kód: [Vybrat]
2146413821 & 2^0 = 2146413821 & 1 = 1111111111011111010110011111101 & 1 = 1
2146413821 & 2^2 = 2146413821 & 4 = 1111111111011111010110011111101 & 100 = 100 = 4
2146413821 & 2^3 = 2146413821 & 8 = 1111111111011111010110011111101 & 1000 = 8
2146413821 & 2^4 = 2146413821 & 16 = ... = 16
2146413821 & 2^5 = 2146413821 & 16 = 32
2146413821 & 2^6 = 2146413821 & 32 = 64
2146413821 & 2^7 = 2146413821 & 128 = 128
2146413821 & 2^8 = 2146413821 & 256 = 1111111111011111010110_0_11111101 & 1_00000000 = 0
2146413821 & 2^9 = 2146413821 & 512 = 111111111101111101011_0_011111101 & 1_000000000 = 0
2146413821 & 2^10 = 2146413821 & 1024 = 11111111110111110101_1_0011111101 & 1_0000000000 = 1024
2146413821 & 2^11 = 2146413821 & 2048 = 2048
2146413821 & 2^12 = 2146413821 & 4096 = 0
2146413821 & 2^13 = 2146413821 & 8192 = 8192
2146413821 & 2^14 = 2146413821 & 16384 = 0
2146413821 & 2^15 = 2146413821 & 524288 = 524288
2146413821 & 2^16 = 2146413821 & 1048576 = 1048576
2146413821 & 2^17 = 2146413821 & 2097152 = 2097152
2146413821 & 2^18 = 2146413821 & 2097152 = 4194304
2146413821 & 2^28 = 2146413821 & 8 = 268435456

Atd atd... Jen nevim, k čemu je to dobrý...:D

Re:Můžete mi vysvětlit výpočet?
« Odpověď #3 kdy: 10. 01. 2014, 15:45:10 »
jo, todle jsem videl, kdyz se v nejakym systemu nastavujou opravneni, prava jednoho uzivatele pak zapises jako jeden int

prava maj ID 0-31

a pak muzes definovat neco takovyho:

function hasAccess($access_where){
  return $this->access & 2^$acess_where !=false;
}


jinak tydle operaci se rika and po bitech

Re:Můžete mi vysvětlit výpočet?
« Odpověď #4 kdy: 10. 01. 2014, 15:46:39 »
jo, misto toho ^ ma bejt pow(2, $access_where) uz blbnu, ^ je zase xor po bitech


none_

Re:Můžete mi vysvětlit výpočet?
« Odpověď #5 kdy: 10. 01. 2014, 15:48:13 »
Jo hezký příklad.:) Díky...

Re:Můžete mi vysvětlit výpočet?
« Odpověď #6 kdy: 10. 01. 2014, 15:49:44 »
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)

Re:Můžete mi vysvětlit výpočet?
« Odpověď #7 kdy: 10. 01. 2014, 15:56:44 »
a jeste lip se da misto umocnovani pouzit bitovej posun doleva (1<<$access_where)

webhope

Re:Můžete mi vysvětlit výpočet?
« Odpověď #8 kdy: 10. 01. 2014, 15:59:19 »
none_: z těch prvních tří řádků jsem to nepochopil (to by chtělo barevně zobrazit ten konktrétní bit) ale  u těch násobků 256, 512 a 1024 už jsem to pochopil. Takže jde o to hledat ten jeden konkrétní bit, první bit čísla kterým násobím...

Ten zbytek - to využití, tak nad tím ještě musím přemýšlet. Taky to nechápu.

webhope

Re:Můžete mi vysvětlit výpočet?
« Odpověď #9 kdy: 10. 01. 2014, 16:09:15 »
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.

none_

Re:Můžete mi vysvětlit výpočet?
« Odpověď #10 kdy: 10. 01. 2014, 16:10:38 »
No nemusí to být jen první bit. Záleží na těch konkrétních číslech. Prostě když se potkají na stejné pozici jedničky, tak je opíšeš. Jinak píšeš nulu. Nakonec číslo převedeš zase zpátky do desítkový.

Každopádně v tvém případě jsou to asi všude jen mocniny dvou a pak opravdu záleží jen na první 1.

none_

Re:Můžete mi vysvětlit výpočet?
« Odpověď #11 kdy: 10. 01. 2014, 16:18:18 »
no podle predchoziho vzorce od Zikofela je to jednoduchý.
Nadefinuješ role:
2^0 = 1 == můžu na stránku
2^1 = 10  == můžu psát komentáře
2^2 = 100  == můžu přidávat články
...

pak nadefinuješ pro konkrétního uživatele oprávnění.
např:
101 = 5 a to uložíš do DB.

Uživatel příjde a chceš vědět, jestli může na stránku, tak zavoláš tenhle vzorec pro hodnoty:
$bool =  $global & pow(2,$fld_acs);
$global = 101 - oprávnění uživatele
$fl_asc = 2 - např

--> $bool = 101 & pow(2,2) = 101 & 100 = 100 = 4

Pokud $bool == 0, tak nemá oprávnění. Jinak .

none_

Re:Můžete mi vysvětlit výpočet?
« Odpověď #12 kdy: 10. 01. 2014, 16:19:08 »
ps: role mají čísla 0, 1, 2, 3, 4,...

webhope

Re:Můžete mi vysvětlit výpočet?
« Odpověď #13 kdy: 10. 01. 2014, 16:37:58 »
none_: Ta první věc co se týká přístupu kde nastavuješ On/Off jako binární 1 nebo 0, to už chápu.
Ale, když jsem tak o tom přemýšlel, tak mě napadlo co tedy znamená ten základ v pow? násobím číslo dva. Znamená to dva možné stavy? Mám dva stavy, takže kdybych měl stavy tři budu násobit číslo 3? A pokud ano, bylo by nutné mít toto pole, kde jsou uložené přístupy mít vše ve stejném rozměru? Pokud příjmu předpoklad, že potřebuji tři stavy, vytvořil bych pole
0,1,2,3,4 ... kde ale každý prvek pole má tři bity. Tedy první prvek má 0000,0001,0010, druhý má 0011, 0100, 0101, třetí má 0110, 0111, 1000, atd. jestli jsem nic nevynechal... Pak by první role pro všechny tři byla rovna 0000, 0011, 0110 ... ; druhá role by byla rovna 0001, 0100, 0111, a poslední role by byla rovna 0010, 0101, 0111 , ovšem nepočítalo by se to tak snadno jako u základu 2. A já nevím třeba je tento můj předpoklad úplně špatný...

Mr. Curious

Re:Můžete mi vysvětlit výpočet?
« Odpověď #14 kdy: 10. 01. 2014, 16:55:22 »
Ja jsem vedel, ze je to s programatory v PHP zle. Jen jsem netusil, ze az tak moc ...