Miten tehdään lukujärjestelmämunnos kantaluvuilla 2-10 molempiin suuntiin?
lukujärjestelmämuunnos
orava
81349
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Turvaa tilisi vahvistamalla puhelinnumerosi. Voit silloin palauttaa unohtuneen salasanan tekstiviestillä.
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
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.
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;
}
}
/* 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).
"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ä.
itse tein vastaavalla tehtävänannolla oulun yliopistoon johdatus ohjelmointiin kurssille harjoitustyön. ei ollu vaikea, kannattaa kokeilla tehdä itse.
...valmistuivat ennen kuin internet yleistyi !