Autor Zpráva
halogan
Profil
Dobrý den,
dneska jsem se chtěl nějak poučit co se týče bitových operátorů, ale jaksi jsem to nepochopil. Četl jsem asi 3 české a několik anglických návodů a stále to nechápu. Mohl by mi to prosím někdo polopaticky vysvětlit? Díky

print $b & ~1; // vypise nejvyssi sude cislo, ale mensi nez $b, ale nevim proc :)

Charlie
Profil
Já vím, že zápis:
if ($x & 1) {

// $x je sudé číslo
}

X je sudé, protože prý má první bit nastavený na 1.

Bitové operátory jsem taky nepochopil, protože o se o nich nikde podrobně nepíše.
halogan
Profil
Dle mych testu:
if ($x & 1) {


// $x je liché číslo

}
Charlie
Profil
No vidíš, máš pravdu. Já to tady mám v jednom scriptu blbě napsané.
halogan
Profil
Odpovedi jdu cist sem:
http://en.wikipedia.org/wiki/Binary_numeral_system
http://en.wikipedia.org/wiki/Bitwise_operation
Jáá
Profil
Není to až zas tak složité. Nechce se mi o tom rozepisovat, ale možná vám pomůže tohle (je to pro C, ale pracuje to stejne jako v php): http://www.linuxsoft.cz/article.php?id_article=741.
Je to namátkou z Googla při hledání "bitové operátory php".
Jáá
Profil
Tak už jsem se koukal na Wikipedii a pokud umíte anglicky, tak je to tam fakt dobrý.
halogan
Profil
Jáá: Oba linky, cos mi poslal jsem už dávno procházel, ale na Wikipedii to je srozumitelně, už to docela chápu, jen mi občas něco nevyjde, např.:


print ~8; // 1000 => 0111, ocekavam 7, ale dostanu -9, proc?
halogan
Profil
Bezva, je to moc pekny, binarka se mi zacina libit. Uz jsem konecne i pochopil proc ($x & 1) vraci 1 pokud je liche :)

Jedna otazecka: Jak se to da v PHP nejak rozumne vyuzit?

Napada me treba testovani sude/liche bez pouziti modula, to nejvyssi sude (ktere furt nechapu), ale dal nevim. Diky

Profil *
zkus

print decbin(~8);
kaifman
Profil
dejme tomu ze mas treba vic vlastnosti u neceho a misto toho aby jsi musel pro kazdou vlastnost delat zvlast bool sloupecek muzes mit vsechny vlastnosti v jednom integeru, vahy vlastnosti musi byt naslenovne 1,2,4,8,16,32,64,128,atd a pak kdyz chces zjistit jestli ta dana vlastnost je tak: if ($neco & 8 = 8) {echo "neco ma vlastnost osm"; }
halogan
Profil
kaifman: Nejak dobre jsem te nepochopil, mohl by jsi dat kraticky prikladek? Diky
kaifman
Profil
mame treba takovehle role a jejic bitove vahy

1=>'Administrátor'
2=>'Obchodník'
4=>'Správce obsahu'
8=>'Uživatel'



create table uzivatel(id int primary key auto_increment, jmeno varchar(50), role int);

a ted chceme vytahnout z tabulky vsechny kteri maji roli spravci obsahu (muzou mit i jinou)

select * from uzivatel where role&4=4;

kdybys chtel jenom s roli spravce obsahu tak das role=4, to je jasny


nebo chceme ulozit noveho uzivatele ktery bude admin a spravce obsahu

insert uzivatel set jmeno='alois', role=1|4;
halogan
Profil
kaifman: Diky, uz to docela chapu. Jen jeste dobre pochopim, jak to presne pracuje, jak se pridava, odebira, ... a bude to v poho, diky moc.
halogan
Profil
Jsem to asi pochopil:
$h = Array(2, 8, 10, 12, 17, 20, 21, 22, 23); // hodiny kdy se zobrazuje

foreach ($h as $hour) {
$hodiny |= 1 << $hour; // priradime
}

print $hodiny & 1024; // vypise 1024, v deset se zobrazuje
$hodiny ^= 1024; // v deset se to smaze
print $hodiny & 1024; // smula, nic


Diky moc kaifmane, diky tobe se mi rozsiril horizont nejen co se tyce praktik. DB navrh ted budu resit mnohem jednuseji!
llook
Profil
print ~8; // 1000 => 0111, ocekavam 7, ale dostanu -9, proc?

Ono to totiž není z 1000 na 0111, ale z 00001000 na 11110111 (akorát ve skutečnosti je těch bitů 32). Pokud je nejvyšší bit integeru 1, je to vždycky záporné číslo.

Záporná čísla se tvoří takzvaným dvojkovým doplňkem:
$zaporne = ~ ($kladne + 1);
a naopak
$kladne = ~ ($zaporne + 1);

Proto například binární negace nuly je mínus jedna.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0