Hirdetés

Új hozzászólás Aktív témák

  • Fire/SOUL/CD

    félisten

    válasz t.timikee #196 üzenetére

    Hali!

    Szóval, az elején szögezzük le, hogy ebben a formában a feladat megoldása értelmetlen, azt is leírom majd a későbbiekben, hogy miért.

    Nagyon fontos szabály, hogy egy feladat EGYÉRTELMŰEN ÉRTELMEZHETŐ legyen ill különböző módszerekkel történő megoldása esetén is AZONOS EREDMÉNY jöjjön ki.

    Tehát értelmezzük a feladatot.
    Bemenő adatok: V1,V2(eax,ebx) 32 bites egész
    módosított adat: al regiszter ami 1 vagy 0, 8bites egész szám

    AL=(V1 minden bitje >= V2 megfelelő bitje)?1:0
    Ez egy feltételes értékadás c/c++-ban, magyarul ha a feltétel IGAZ(V1 minden bitje >= V2 megfelelő bitje), akkor AL=1, ha a feltétel HAMIS, akkor AL=0

    a "minden bitje" vs. "megfeleő bitje" azt jelenti, hogy az első változó(V1->eax) minden bitjét(32 bit), össze kell hasonlítani a második változó(V2->ebx) minden, azonos helyiértékű bitjével.
    A legmagasabb helyiértékű bit(32 bites szám esetén) 31, a legkisebb meg 0.
    Tehát a feladat, hogy eax 31. helyiértékű bitjét hasonlítsuk össze ebx 31. helyiértékű bitjével, aztán a 30.-kat a 30.-kal, egészen míg el nem jutunk eax 0. helyiértékű bitjének ebx 0. helyiértékű bitjével való összehasonlításig.

    Mivel kettes(bináris) számrendszerről beszélünk a bit értéke 0(alacsony) vagy 1(magas) lehet. Tehát az azonos helyiértékű bitek összehasonlításakor 4 eset állhat fenn.
    0 és 0, 0 és 1, 1 és 0, 1 és 1.
    Most helyettesítsük be a feltételbe, eax adott bitje >= ebx eax-szel azonos helyiértékű bitje
    0 és 0 esetén IGAZ, mert egyenlő
    0 és 1 esetén IGAZ, mert nagyobb
    1 és 0 esetén HAMIS, mert kisebb
    1 és 1 esetén IGAZ, mert egyenlő

    Most pedig jöjjön, hogy miért is értelmetlen a feladat megoldása.
    Két módszer amit alkalmazhatunk, hogy vagy 31. bittől megyünk a 0. bit írányába(balról jobbra) vagy a 0. bittől megyünk a 31. bit írányába(jobbról balra). DE, elöbbi esetben teljesen felesleges a 31-től 1. bitek összehasonlítása hiszen az utolsó 0. helyiértékü bit összehasonlításakor veszi vel a végleges értékét AL. Az utóbbiban meg teljesen felesleges a 0-tól 30. bitek összehasonlítása hiszen az utolsó 31. helyiértékü bit összehasonlításakor veszi vel a végleges értékét AL. Nem is beszélve arról, hogy a két módszer két különböző eredményt ad ill. adhat.
    Na ezért értelmetlen a feladat megoldása.

    A feladatot aki feladta, nagy valószínüséggel az volt a szándéka, hogy gyakoroljátok a bitműveleteket, a fenti lehetőség fel sem merült benne.
    A feladatot többféleképpen lehet "értelmessé" tenni. Én azt választottam, hogy megszámoljuk hányszor lesz igaz ill hamis a feltétel a bitművelet során, ha az igaz a több akkor AL=1, ha a hamis akkor AL=0, ha meg egyenlő akkor AL=-1.
    Itt annyit azért még hozzáfűznék hogy hamis kevesebbszer fordul elő(mint ahogy feljebb látszik), ezért a >= relációt modosítani kellen egyenlőre, így 0 és 1 esetén is hamis lenne.

    Várom válaszod, megjegyzésed, kérdésed stb.
    Ha minden tiszta és a módosítással is egyetértesz, akkor megcsinálom a kódót is.

    Fire.

    Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

Új hozzászólás Aktív témák