Bitin siirto vasemmalle, mutta täyttö ykkösillä

piirut.vasemmalle

Tämän seurauksena
0b01 << 1
on
0b10

Mutta jos halutaan 0b11, niin kuinka se pitäisi tehdä?

11

583

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • piirut.vasemmalle

      Tein nyt purkkapatenttina makron, jossa siirretään ensin normaalisti vasemmalle, ja sitten ORilla ynnätään loppuun tarvittava määrä ykkösiä. Ei mikään tyylikkäin tapa, mutta vaikuttaisi toimivan. Jos jollain on järkevämpi vaihtoehto, niin vinkkiä voi antaa.

      #define vasemmalle(luku,bitit) ((luku<<bitit)|((unsigned)0-1)>>((sizeof(luku)*8)-bitit))

      • 34534534

        Miksi noin monimutkainen jos vai pitää siirtaa vasemmalle ja lisätä ykkönen?
        Sifti on erittäi nopea operaatio ja niin on myös ykkösen lisääminen. Kääntäjä muuttaa ykkösellä lisäämisen yhdeksi koneoperaatioksi missä ei ole edes parametria. Samoin sifti on yksi operaatio.

        Mihin tuota bitit-parametiä tarvitaan jos kuitenkin siirretään yhdellä vasemmalle?


      • piirut.vasemmalle
        34534534 kirjoitti:

        Miksi noin monimutkainen jos vai pitää siirtaa vasemmalle ja lisätä ykkönen?
        Sifti on erittäi nopea operaatio ja niin on myös ykkösen lisääminen. Kääntäjä muuttaa ykkösellä lisäämisen yhdeksi koneoperaatioksi missä ei ole edes parametria. Samoin sifti on yksi operaatio.

        Mihin tuota bitit-parametiä tarvitaan jos kuitenkin siirretään yhdellä vasemmalle?

        No joo, selitin kyllä aika huonosti mitä olin tekemässä. Eli tietysti sen yhden bitin siirto käy näppärärästi kuvailemallasi tavalla, mutta tässä oli tarve shiftata enemmänkin kerralla. Tuo bitit-parametri on siis se shiftauksen määrä. Vähän ehkä tyhmä nimivalinta, mutta en nyt jaksanut keskittyä epäolennaiseen.

        Tässä vielä testiajo 0-9 bitin siirtämisellä, kun käytetään lukua 1. Tuosta huomaa että bitit-parametrillä 0 tulee aivan mitä sattuu, eli nollan käyttö pitää estää jollain muulla tavalla.

        Koodi:
        ---
        #include <stdio.h>

        #define vasemmalle(luku,bitit) ((luku<<bitit)|((unsigned)0-1)>>((sizeof(luku)*8)-bitit))

        int main(void);

        int main(void) {
            unsigned long luku=0b1;
            char i=0,bitti=0;
            for(i=0;i<10;i ) {
                bitti=sizeof(luku)*8-1;
                printf("vasemmalle(%lu,%d) -> ",luku,i);
                while(bitti>=0) {
                    if((vasemmalle(luku,i))&(1<<bitti)) printf("1");
                    else printf("0");
                    if(bitti%8==0) printf(" ");
                    bitti--;
                }
                printf("\n");
            }
            return 0;
        }
        ---

        Tulos:

        vasemmalle(1,0) -> 11111111 11111111 11111111 11111111
        vasemmalle(1,1) -> 00000000 00000000 00000000 00000011
        vasemmalle(1,2) -> 00000000 00000000 00000000 00000111
        vasemmalle(1,3) -> 00000000 00000000 00000000 00001111
        vasemmalle(1,4) -> 00000000 00000000 00000000 00011111
        vasemmalle(1,5) -> 00000000 00000000 00000000 00111111
        vasemmalle(1,6) -> 00000000 00000000 00000000 01111111
        vasemmalle(1,7) -> 00000000 00000000 00000000 11111111
        vasemmalle(1,8) -> 00000000 00000000 00000001 11111111
        vasemmalle(1,9) -> 00000000 00000000 00000011 11111111


    • singleasemblyline

      olisit käyttänyt "latchea", eli assembly-komentoa RCR&RCL =rotate with carry..., single line...

    • (0b01 << 1) | 1

      • Anonyymi

        Tässä on se ongelma, että muuttaa myös kaikki muut bitit, kuin vain lisätyt bitit.


    • Anonyymi

      #define vasemmalle(luku,bitit) (~(~(luku)<<(bitit)))

      • Anonyymi

        Tässähän se.


      • Anonyymi

        Tuo on tyylikäs. Ensin lähtöluvun invertointi, sitten siirto joka täyttää nollilla, ja sitten koko luvun invertointi uudelleen, jolloin lisätyt nollat muuttuvat ykkösiksi.

        Hieno oivallus! Ojennetaan nimimerkki Anonyymille virtuaalinen papukaijamerkki.


    • Se << siirtää bittejä vasemmalle ja täyttää nollia.

      lisää yksi, ja täyttää sen oikeanpuolimmaisen siis ykkösellä.

      Jos pitää täyttää ykkösillä ja siirtää useita kerralla niin silmukassa lisää yhden vasemmalle ja lisää yhden, ja toistaa sitä.

      • Joskus ratkaisua kannattaa hetken miettiä aivan oppimistarkoituksessakin. C-kieli on siitä jännä juttu, että yksinkertaisuudestaan huolimatta siinä riittää oppimista jopa vuosikymmeniksi. Ylläolevan makron pitäisi toimia ja vieläpä kaikilla integer-tyypeillä....vaikken olekaan testannut sitä.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Eroa Orpo! Orpo eroa!

      Suomen kansa vaatii viimein ottamaan meidät huomioon, eikä vain ulkomaalaisia pääomasijoittajia. Koska täällä Suomessa
      Maailman menoa
      353
      3957
    2. Riikan vappumiljardin maksavat sairaat, vanhukset ja kuolleiden omaiset

      Vappumiljardi, eli Riikan päätös laskea yhteisöveroa kaksi prosenttiyksikköä 18 prosenttiin, vie verotuloja noin miljard
      Maailman menoa
      131
      2885
    3. Ammattiliittojen jäsenmaksut valtion maksettavaksi

      Ammattiliitot neuvottelvat jäsenilleen paremmat palkat, jotka lisäävät valtio verotuloja. Tästä syystä valton tulee maks
      Maailman menoa
      3
      2472
    4. SDP esti Suomen luisumisen kohti 1984 Orwell -yhteiskuntaa

      Äärioikeistohallitus olisi halunnut Stasin tapaan mikrofonit jokaisen kansalaisen kotiin, mutta SDP esti tuon siirtymän
      Maailman menoa
      98
      2317
    5. Odottavan aika on pitkä, Lindtmanin hallitusta tule jo!

      Eilisen perusteella nykyinen hallitus epäonnistui kaikissa vaalilupauksissaan, joten olemme ansainneet uudet eduskuntava
      Maailman menoa
      114
      2085
    6. Wille Rydman (ps) osoitti olevansa kommunisti

      Hän toistaa Neuvostoliiton virhettä. Haluaa pitää palveula yllä maksoi mitä maksoi, vaikkei ole maksavia asiakkaita. --
      Maailman menoa
      63
      2037
    7. Särkyneelle sydämelle

      Särjin sun sydämen En voi lakata itkemästä Minuun tekee kipeää Koska sinuunkin. Että näin.. En ole runoilija😂
      Suhteet
      35
      1802
    8. Menettämisestä

      Ajatteletko, että olet menettänyt mahdollisuutesi häneen? Osaatko sanoa miksi niin tapahtui?
      Ikävä
      131
      1647
    9. Tulli ja Poliisi HAZMAT-suojauksin varustettuna omakotitaloa tutkimassa.

      Todennäköisesti kysymyksessä huumelaboratorio, jossa käsitellään tappavia ja vaarallisia kemikaaleja. Tulli ja poliisi
      Savonlinna
      24
      1479
    10. Nainen sä olet

      Ihailtava ihminen siinä mielessä että teet miten sydän käskee ja toisaalta taas pidättäydyt kaikesta. Pakenet ja lähest
      Ikävä
      77
      1398
    Aihe