Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Xor-operaattori

Sivun loppuun

hunajavohveli [18.06.2004 20:51:24]

#

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.

iluwatar [18.06.2004 21:20:53]

#

Löytyyhän se. Esim.

unsigned int a, b, r;
r = a ^ b;

hunajavohveli [19.06.2004 10:32:59]

#

Noinhan se olikin. Hämäsi vain aluksi, kun tuo ^ on Basicissa potenssi. Nyt toimii, kiitos.

thefox [20.06.2004 04:06:40]

#

Ehkä voisi vielä huomauttaa että && ja || ovat vertailuoperaattoreita, itse binäärioperaatiot and ja or suoritetaan &:lla ja |:lla.

hunajavohveli [20.06.2004 11:18:24]

#

Aivan, eli siis && ja || käsittelevät vain totuusarvoja.

Markus [20.06.2004 15:30:23]

#

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.

Dual [20.06.2004 20:50:48]

#

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.

hunajavohveli [21.06.2004 11:42:38]

#

Entäs jos palautusarvo on määritelty bitiksi? Miten muuten saa määriteltyä muutujan bitiksi, tai yhdeksi tavuksi?

Metabolix [21.06.2004 12:57:24]

#

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.

iluwatar [21.06.2004 13:38:33]

#

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.

Dual [21.06.2004 17:02:42]

#

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ä.

hunajavohveli [21.06.2004 17:57:37]

#

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) :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta