lukujärjestelmämuunnos

Miten tehdään lukujärjestelmämunnos kantaluvuilla 2-10 molempiin suuntiin?
81349
Äänestä

Muut lukivat myös

Vastaukset 8

Vanhimmat

"Miten tehdään lukujärjestelmämunnos kantaluvuilla 2-10 molempiin suuntiin?"

Tämähän ei varsinaisesti ole ohjelmointiaiheinen kysymys, vaan puhtaasti matemaattinen.

Helpointa toimenpide on tehdä muuntamalla luku ensin kymmenjärjestelmään ja siitä sitten halutulle uudelle kantaluvulle. Vai tarkoititko kenties, että muunnoksia tarvitaan pelkästään binaari- ja desimaalijärjestelmän välillä (joka on vielä yksinkertaisempaa)?

Lukujärjestelmiä ja kantaluvun muuttamista käsitellään lukion matematiikassa ja muistaakseni kysytään ylppäreissäkin aika usein.

Esimerkkinä homma menee näin. Muutetaan binaariluku 101011 desimaaliksi käymällä bitit vähiten merkitsevästä (LSB) bitistä ylöspäin. Tietänet, miten binaariluvut toimivat, joten en ala sitä tässä selittämään.

101011 (bin) = 1*2^0 1*2^1 0*2^2 1*2^3 0*2^4 1*2^5 = 1 2 0 8 0 32 = 43 (dec)

Toisin päin käytetään modulo- eli jakojäännösoperaattoria. Muutetaan esim. luku 134 binaarijärjestelmään:

134 = 67 * 2 0
67 = 33 * 2 1
33 = 16 * 2 1
16 = 8 * 2 0
8 = 4 * 2 0
4 = 2 * 2 0
2 = 1 * 2 0
1 = 0 * 0 1

Ja sitten luetaan jakojäännökset alhaalta ylöspäin: 10000110 (bin) = 134 (dec)

Tämän tekeminen C:llä pitäisi olla hyvin helppoa, kun onnistuin sen tekemään hetkessä TI-85:n basic-kielelläkin, ja niin, että kaikki muunnokset kantaluvuilla 2-35 ovat sallittuja.

Äänestä

kokonaisluvusta binääriks.

void itob(char s[], unsigned n)
{
  int i = 0;

  do {
    s[i++] = n % 2 + '0';
  while ( (n /= 2) > 0);
  s[i] = 0;
  reverse(s);
}

void reverse(char s[])
{
  int c, i, j;

  for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
    c = s[i];
    s[i] = s[j];
    s[j] = c;
  }
}

Äänestä
  • /* gcc -Wall tmp.c -lm */
    #include
    #include
    #include
    #include

    void reverse(char *);
    void binaariks(char *, unsigned);
    unsigned kokluvuks(char *);

    int main(void)
    {
    char s[255];
    unsigned n = 59;
    unsigned k;

    binaariks(s, n);
    printf("%u on binäärinä %s\n", n, s);
    printf("takaisin kokonaisluvuksi binääri: %s\n", s);
    k = kokluvuks(s);
    printf("k = %u\n", k);


    putchar('\n');
    n = 65536;
    binaariks(s, n);
    printf("%u on binäärinä %s\n", n, s);
    printf("takaisin kokonaisluvuksi binääri: %s\n", s);
    k = kokluvuks(s);
    printf("k = %u\n", k);

    exit(0);
    }

    void binaariks(char s[], unsigned n)
    {
    int i = 0;

    do {
    s[i++] = n % 2 + '0';
    } while ( (n /= 2) > 0);
    s[i] = 0;
    reverse(s);
    }

    void reverse(char s[])
    {
    int i, j, c;

    for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
    c = s[i];
    s[i] = s[j];
    s[j] = c;
    }
    }

    unsigned kokluvuks(char s[])
    {
    int i;
    unsigned n = 0;

    reverse(s);

    for (i = 0; i < strlen(s); i++) {
    if (s[i] == '1')
    n += (1

    Äänestä

  • koodati kirjoitti:

    /* gcc -Wall tmp.c -lm */
    #include
    #include
    #include
    #include

    void reverse(char *);
    void binaariks(char *, unsigned);
    unsigned kokluvuks(char *);

    int main(void)
    {
    char s[255];
    unsigned n = 59;
    unsigned k;

    binaariks(s, n);
    printf("%u on binäärinä %s\n", n, s);
    printf("takaisin kokonaisluvuksi binääri: %s\n", s);
    k = kokluvuks(s);
    printf("k = %u\n", k);


    putchar('\n');
    n = 65536;
    binaariks(s, n);
    printf("%u on binäärinä %s\n", n, s);
    printf("takaisin kokonaisluvuksi binääri: %s\n", s);
    k = kokluvuks(s);
    printf("k = %u\n", k);

    exit(0);
    }

    void binaariks(char s[], unsigned n)
    {
    int i = 0;

    do {
    s[i++] = n % 2 + '0';
    } while ( (n /= 2) > 0);
    s[i] = 0;
    reverse(s);
    }

    void reverse(char s[])
    {
    int i, j, c;

    for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
    c = s[i];
    s[i] = s[j];
    s[j] = c;
    }
    }

    unsigned kokluvuks(char s[])
    {
    int i;
    unsigned n = 0;

    reverse(s);

    for (i = 0; i < strlen(s); i++) {
    if (s[i] == '1')
    n += (1

    entä, jos haluttais, että kysellään mille kantaluvulle 2,3,4,5,6,7,8,9,10 muunnos tehdään esim. bin...des tai des....bin tai 6-kanta...des tai des....6-kanta jne...
    Virheilmoitus jos luku - tai >10000 tai ei em. kantaluvut (2-10).

    Äänestä

  • Orava kirjoitti:

    entä, jos haluttais, että kysellään mille kantaluvulle 2,3,4,5,6,7,8,9,10 muunnos tehdään esim. bin...des tai des....bin tai 6-kanta...des tai des....6-kanta jne...
    Virheilmoitus jos luku - tai >10000 tai ei em. kantaluvut (2-10).

    "entä, jos haluttais, että kysellään mille kantaluvulle 2,3,4,5,6,7,8,9,10 muunnos tehdään esim. bin...des tai des....bin tai 6-kanta...des tai des....6-kanta jne..."

    Tuosta nyt ei ota selvää Erkkikään, mitä yrität kysyä. Ilmeisesti haluat kuitenkin valmista ratkaisua johonkin ohjelmoinnin kotitehtävään, jota et itse viitsi miettiä.

    "Virheilmoitus jos luku - tai >10000 tai ei em. kantaluvut (2-10)."

    Mihin ihmeeseen tarvitset C-kielistä koodia ellet osaa itse sitä tuon vertaa tehdä?

    Äänestä

  • Strawman kirjoitti:

    "entä, jos haluttais, että kysellään mille kantaluvulle 2,3,4,5,6,7,8,9,10 muunnos tehdään esim. bin...des tai des....bin tai 6-kanta...des tai des....6-kanta jne..."

    Tuosta nyt ei ota selvää Erkkikään, mitä yrität kysyä. Ilmeisesti haluat kuitenkin valmista ratkaisua johonkin ohjelmoinnin kotitehtävään, jota et itse viitsi miettiä.

    "Virheilmoitus jos luku - tai >10000 tai ei em. kantaluvut (2-10)."

    Mihin ihmeeseen tarvitset C-kielistä koodia ellet osaa itse sitä tuon vertaa tehdä?

    Lasketaanpa yhteen tämän viestiketjun alkuperäinen viesti sekä Ohjelmointipalstalla oleva viesti otsikolla "lukujärjestelmä". Summaksi saadaan loogisella päättelyllä "peruskurssin pakollinen koulutehtävä, deadline parin päivän sisällä, itse ei ole jaksanut kokeilla mitään, joten annetaanpa muiden tehdä ohjelma minun puolestani". Pyyntö virheenhallinnan hoitavasta koodistakin vain varmistaa epäilykset. No, eipä ole ensimmäinen kerta täällä.

    Äänestä

  • Mik kirjoitti:

    Lasketaanpa yhteen tämän viestiketjun alkuperäinen viesti sekä Ohjelmointipalstalla oleva viesti otsikolla "lukujärjestelmä". Summaksi saadaan loogisella päättelyllä "peruskurssin pakollinen koulutehtävä, deadline parin päivän sisällä, itse ei ole jaksanut kokeilla mitään, joten annetaanpa muiden tehdä ohjelma minun puolestani". Pyyntö virheenhallinnan hoitavasta koodistakin vain varmistaa epäilykset. No, eipä ole ensimmäinen kerta täällä.

    itse tein vastaavalla tehtävänannolla oulun yliopistoon johdatus ohjelmointiin kurssille harjoitustyön. ei ollu vaikea, kannattaa kokeilla tehdä itse.

    Äänestä

...valmistuivat ennen kuin internet yleistyi !

Äänestä

Kommentoi aloitusta


orava kirjoitti:

Miten tehdään lukujärjestelmämunnos kantaluvuilla 2-10 molempiin suuntiin?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu