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

593

    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. Vesikin maksaa, miksei hengitysilma?

      Jatkuvasti itketään ettei ole rahaa mihinkään, mutta tilastojen mukaan rahaa on enemmän kuin koskaan, joten miksei asial
      Maailman menoa
      34
      1962
    2. Satuolennoista tarinointi ei kuulu peruskoulun tehtäviin

      Opetustunteja on muutenkin käytössä vain rajallinen määrä. Eli nämä satuhommat koulun ulkopuolelle vapaaehtoisiin harras
      Maailman menoa
      165
      1890
    3. Suomalainen perheenisä vaatii Suvivirren esittämisestä hyvityksiä

      Itse lapsena uskonnonopetuksesta vissiin traumoja saanut ihka suomalainen (!) perheenisä vaatii Espoon kaupungilta korva
      Maailman menoa
      382
      1792
    4. Mies profiloin sinut

      Etsit täysin hallittavaa mutta samalla poikkeuksellista ihmistä. Etsit jotain mitä et koskaan tule saamaan.
      Ikävä
      216
      1248
    5. Nostetaanko nainen kissa pöydälle?

      Ja selvitetään nämä tunteet?
      Ikävä
      92
      1123
    6. Kiantama kartelli

      Onko alhaisempaa kuin toimia ensin kartellissa ja lopuksi koittaa pelastaa nahkasa vasikoimalla muut kun jää kiinni? Eip
      Suomussalmi
      34
      970
    7. Oletko ollut *ittupää

      Siinäpä se kysymys eli oletko ollut *ittupää hänelle? Miksi?
      Ikävä
      95
      765
    8. Kiantama oy

      Tämän päivän uutiset.....https://www.is.fi/taloussanomat/art-2000012036470.html.
      Suomussalmi
      15
      698
    9. Haluaisin nähdä ja tavata sinut mies

      Vielä tässä elämässä.
      Ikävä
      32
      674
    10. Saako 60 v vielä töitä? Arto Nyberg puhuu suoraan elämästä ilman töitä

      Arto Nyberg täyttää tänään 60 v. Onnea! Nyberg totuttiin näkemään suoran haastatteluohjelman kapteenina vuodesta toise
      Maailman menoa
      47
      665
    Aihe