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

444

    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. Kela valvoo lasten tilejä.

      Tämä isoveli Kela kyttää jopa lasten yli 200,- euron rahat jotka on melko varmasti lahjaksi saatu. Se vaikuttaa perheen
      Yhteiskunta
      293
      3378
    2. Nainen, tervetuloa

      Tule luokseni eka vaikka viikoks tai pariksi. Saisin helliä, kannustaa ja tukea sua ja kokata lempi herkkujasi. Pääsisit
      Ikävä
      25
      3354
    3. TTK-tähti Saana Akiola paljasti tv-ohjelmassa tapahtuneen ahdistelun

      Olisko pitänyt suunnitella ulostulo paremmin? Nyt lehdet soittelevat kaikki 8 läpi ja kuusi sanoo ettei koskenut häntä.
      Maailman menoa
      26
      2160
    4. Olisit ollut varovaisempi

      Nyt jos minut hylkäät ja et meidän asiasta minulle mitään ilmoita niin ettet edes anteeksi pyydä, niin tiedä että minä e
      Ikävä
      35
      1994
    5. Mitä haluaisit sanoa hänelle

      Nyt tällä hetkellä?
      Ikävä
      133
      1982
    6. Elisa laskuttaa jo sähköpostilaskusta erikseen euron

      Paperilaskuista on otettu lisämaksua jo ajat sitten, mutta nyt Elisa ottaa euron siitä että lähettävät sähköisen laskun
      Maailman menoa
      119
      1721
    7. Oho! Susanna Laine kohtasi epäonnea lomareissulla Italiassa - Avaa tilannetta: "Vähän sahaavaa..."

      Ou nou! Tsemppiä kuitenkin loppulomaan Italiassa, Susanna Laine ja mahdollinen seuralainen! Lue lisää ja katso kuvat:
      Suomalaiset julkkikset
      7
      1460
    8. Vastenmielisyys

      Kuvaa sinua parhaiten
      Ikävä
      44
      1448
    9. Ensitreffit alttarilla Jyrki paljastaa hääyön intiimiasioista kameroiden sammuttua: "Fyysinen..."

      Ooo-la-laa… Ensitreffit alttarilla -sarjassa alkaa hääparien välillä ns. tunteet kuumenemaan. Lue lisää: https://www.s
      Ensitreffit alttarilla
      2
      1303
    10. Väliämme on noin 6 km

      Niin lähellä ja niin kaukana. Sinä olet kotona, minä olen kotona. Olet jo unessa. Mutta kun herään, olet jo töissä ja vä
      Ikävä
      9
      1203
    Aihe