Páros számok meghatározása C-ben?
"eltudnád magyarázni 5-ös"
#17-es válaszoló nagyon korrektül leírta. Ugyanaz picit másképp:
A bináris egészek így jönnek sorban, mondjuk egytől:
0000 0001
0000 0010
0000 0011
0000 0100 ...
Látszik, hogy az utolsó bit felváltva 0 vagy 1. A 0 páros számra utal, az 1 páratlanra. Tehát ha ki tudjuk nyerni belől az utolsó bitet, már tudjuk, hogy páros-e.
Erre jók a bináris műveletek, amit itt konkrétan "maszkoláshoz" használunk, mert olyan, mintha letakarnánk valamivel biteket, csak az utolsó bitnél hagynánk egy lyukat.
0110 1100 / ez a vizsgálandó szám (x)
0000 0001 / vagy simán 1, ez a maszk (m)
Az ÉS bináris művelet eredménye akkor lesz 1, ha mindkét operandus 1. Ezt bitenként külön, vagyis ahol a maszk 0, ott tuti 0 lesz az eredmény, ahol 1, ott pedig az eredeti bitet kapjuk vissza, vagyis:
0000 0000 / tehát az utolsó bit 0 volt, vagyis egy páros számot vizsgáltunk. (Másik lehetőség, ha 0000 0001 lenne az eredmény.)
Ezt így írjuk le C-ben: x & m
Ternális operátor, mint kifejezés:
<logikai kifejezés> ? <érték, ha a log.kif. igaz> : <érték, ha hamis>
A logikai kifejezés akkor hamis, ha a számértéke 0, minden más esetben igaz. Vagyis a fenti eredményt fel tudjuk használni, csak pont fordítva kell, tehát 0 (páros szám) esetén adjon igazat, egyébként hamisat. Erre kell a tagadás ! jel.
Innen már csak az kell, hogy ha páros, akkor az eredeti számot adja hozzá az összeghez, ha hamis, akkor nullát, vagyis ne adjon hozzá semmit.
(!(x & m)) ? x : 0
(Lehet, hogy a külső zárójel nem is kell, de így a biztos.)
...Bár így talán egyszerűbb lenne:
(x & m) ? 0 : x
:))
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!