Englanti on joskus vaikee oppimiskieli uusille asioille, voisko joku vähän neuvoo?
Mitä käytännön hyötyä on kun bittiä pyöräyttää tai liikuttaa oikeelle tai vasemmalle? tarkoitan niitä ykkösiä. KÄYTÄNNÖN hyötyä? tajuan joo idean mutten järkeä, ja olen nähnyt joissakin koodeissa että se tehdään että saadaan väri tai kerrottua luku.
Toiseksi, tietääkö joku kuinka tai ainakin teorian, että miten desimaalit saadaan näkymään esim. jakolaskusta 7:3? normaalisti vastaus on 2 kun se pyöristetään, mutta nyt pitäis saada näkymään luku ainakin 0.0001:n tarkkuudella että olis järkeä.
Ilm. c++:ssa on macrossa toi mutta assemblerissa pitää jotenkin laskea joku "carry flagi". jotain hjelppiä ni olisin kiitollinen...
kiitti vaan
1. Joskus on koodin luettavuuden kannalta selkeämpää pyöritellä bittejä kuin kertoa tai jakaa vastaavalla luvulla. Esimerkkinä vaikka tuosta värien käsittelystä erillisten RGB-komponenttien arvojen muuntaminen yhdeksi kokonaisluvuksi ja toisin päin.
2. Käytä liukulukuja. Jos liukulukujen tarkkuus ei riitä, niin käytä käytä jotain matematiikkakirjastoa, joka tuottaa tarkkoja lukuja.
Bittien siirto yksi askel vasemmalle vastaa luvun kertomista kahdella. Bittien siirto yksi askel oikealle vastaa luvun jakamista kahdella.
Esimerkiksi 13 * 4 = 52, ja niinpä 13:n binääriesitys on 1101 ja 52:n binääriesitys on 110100.
Tietokoneen on helppo siirtää luvun bittejä, kun taas yleinen kertolasku ja jakolasku ovat vaikeampia. Jos laskun muuttaa bittien siirroksi, koodi saattaa olla lyhyempi ja nopeampi.
Onko käytössäsi jakolasku, joka ilmoittaa osamäärän ja jakojäännöksen? Voit selvittää desimaaleja toistamalla jakolaskuja niin, että uusi jaettava luku on edellisen laskun jakojäännös kerrottuna 10:llä.
Esimerkiksi 15 / 7 = 2,14285... seuraavan laskun perusteella:
15 / 7 = 2, jää 1
10 / 7 = 1, jää 3
30 / 7 = 4, jää 2
20 / 7 = 2, jää 6
60 / 7 = 8, jää 4
40 / 7 = 5, jää 5
Bittisiirroille ja muille bittioperaatioille on yksi aivan harvinaisen mielekäs käyttötarkoitus: bittien käsittely. Esimerkiksi tietyn bitin hakeminen on huomattavasti loogisempaa tehdä bittisiirrolla kuin vaikkapa jakolaskulla. Nähdään suoraan, että binaariluvun 1010 ensimmäinen ykkönen saadaan siirtämällä lukua kolme askelta, kun taas jakaminen 8:lla ei ole lainkaan yhtä loogista — nopeudesta puhumattakaan. Tällaisia operaatioita tarvitaan esimerkiksi silloin, kun halutaan pakata yhteen tavuun monta totuusarvoa. Tilankäyttöhän on tällöin vain kahdeksasosa siitä, mitä tarvittaisiin, jos jokainen arvo olisi omassa tavussaan.
Yleisesti ottaen bittien shiftailua tarvitsee vähän kaikenlaisissa algoritmeissa, vaikkapa CRC32, AES, DES, kaikenlaiset pakkausalgoritmit yms.
Antti Laaksonen kirjoitti:
Jos laskun muuttaa bittien siirroksi, koodi saattaa olla lyhyempi ja nopeampi.
Eiköhän mikä tahansa fiksu kääntäjä osaa muuttaa kerto-/jakolaskun bittien pyöritykseksi, jos se on kyseisellä alustalla nopeampaa. Operaation suoritusnopeus on harvoin mikään syy käyttää jompaa kumpaa tapaa. "Premature optimization is the root of all evil." Jos jollain nopeudella on väliä, niin se on ylläpidon nopeus, mihin sisältyy koodin luettavuus.
ok, shiftailu tuli selväksi, se on joskus ok.
rutiini tulee sitten myöhemmin siitä asiasta.
Laaskosen Antin esitys desimaaleista on avartava esitys myös.
Mutta miten sitä hyödyntäisi, kun ohjelma runko on tälläinen:
main proc
mov nro, sval(input("Anna muokattava luku : "))
invoke GetTickCount
invoke nseed, eax
invoke nrandom, 5000
xor ebx, ebx
mov ebx, eax
print str$(eax)
print chr$(10)
print str$(nro)
print chr$(10)
add nro, ebx
print str$(nro)
ret
main endp
end startEli tässä näkyy, että ihminen antaa luvun ja random generaattori antaa toisen luvun (0 - 5000) ja ne sitten lasketaan yhteen, mutta ajattalin laittaa jakolaskun myöhemmin ja silloin vasta desimaalit on tärkeitä. Eli onko seur. vaihe sallainen että eax rekkarissa oleva luku pitäisi laittaa muuttujaksi "nro2" vaikka ja sitten etsiä desimaalit edellä mainitulla tavalla, jotka printataan sitten tuloksen perään pilkun jälkeen?
Vai pitäskö vaan alkaa opetteleen liukulukulaskentaa? ilm. olis helpompaa
Mod. lisäsi kooditagit
Aihe on jo aika vanha, joten et voi enää vastata siihen.