Onko C++:ssa Xor-operaattoria samaan tapaan kuin &&, || ja ! on and ja or ja not? Voisihan tuon toki koostaa muistakin operaattoreista, mutta aina tietysti nopeampi, jos sellainen on jo valmiina.
Löytyyhän se. Esim.
unsigned int a, b, r;
r = a ^ b;
Noinhan se olikin. Hämäsi vain aluksi, kun tuo ^ on Basicissa potenssi. Nyt toimii, kiitos.
Ehkä voisi vielä huomauttaa että && ja || ovat vertailuoperaattoreita, itse binäärioperaatiot and ja or suoritetaan &:lla ja |:lla.
Aivan, eli siis && ja || käsittelevät vain totuusarvoja.
Itse asiassa myös & ja | ovat vertailuoperaattoreita. Niissä on vain se ero && ja || operaattoreihin, että ne arvottavat molemmat operandit riippumatta siitä mikä ensimmäisen arvo oli.
Esim.
if ( f1() && f2() )
kutsuu funktiota f2 vain, jos f1 palautti toden, koska jos f1 palautti epätoden on lause epätosi riippumatta siitä mitä f2 palauttaa. Kun taas
if ( f1() & f2() )
kutsuu molempia funktioita aina!
^-operaattorista ei ole olemassa ^^ versiota koska xor lauseen arvoa ei voi tietää vain toisen operandin arvottamalla.
Niin siis: && ja || ovat loogisia vertailuoperaattoreita jotka palauttavat joko toden tai epätoden. & ja | ovat binäärioperaattoreita jotka suorittavat vastaavat loogiset operaatiot joka bitille. Saatava arvo voi siten olla mitä tahansa. Syy siihen miksi
if (f1() & f2())
kutsuu molempia aina on täten selvä: Bittikohtainen vertailu vaati molempien funktioiden palautusarvon tuntemisen.
Entäs jos palautusarvo on määritelty bitiksi? Miten muuten saa määriteltyä muutujan bitiksi, tai yhdeksi tavuksi?
hunajavohveli kirjoitti:
Entäs jos palautusarvo on määritelty bitiksi? Miten muuten saa määriteltyä muutujan bitiksi, tai yhdeksi tavuksi?
yksi tavu = "char", "unsigned char"
Bittiä et varsinaisesti saa, koneen muistiin osoitetaan Tavu kerrallaan (Assemblystä tuttua)
Eli lähinnä "bool", vaikka sekin vie kyllä tavun muistista (?)
Kyllä se silti ne molemmat funktiot suorittaa, koska 1&1 on laskutoimitus aivan kuin 1+1.
Myös pilkkuoperaattorilla voi kutsua kahta funktiota peräkkäin. Itse asiassa se on juuri sitä varten. Esim.
if(f1(), f2()) { f3(); }
Välittämättä f1() arvosta tämä ajaa myös f2() ja jos se palauttaa tosi myös f3() ajetaan.
Structin avulla voi kyllä leikkiä helposti yksittäisten bittien kanssa:
struct bit_field { int bit_1 : 1; int bits_2_to_5 : 4; int bit_6 : 1; } bit_var;
Muistia varataan kuitenkin loppujen lopuksi tavun tarkkuudella. Yllä oleva tapa on kuitenkin näppärä.
No ei sen väliä vaikka varattaisiinkin tavun tarkkuudella sillä minun olikin tarkoitus käsitellä yksitellen tasan 64 bittiä, jotka saa jaettua kätevästi 8 tavuun. (No menisipä hirveästi muistia, vaikkei saisi) :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.