PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dualzahlen nach Dezimalzahlen umwandeln



KRibel
05-01-2006, 17:42
Hallo,

kennt jemand eine Funktion unter C mit der man Dualzahlen nach Dezimalzahlen umwandeln kann?
Wenn nicht hat evtl. jemand eine Idee wie man das machen kann?

Gruß

Konstantin

bischi
05-01-2006, 17:48
Dualzahl == Binärzahl?

Bischi

PS: Selber schreiben:



int summe=0;
for (i=0; i<= vorderste Ziffer; i++){
if(aktuelleZiffer ==1){
summe=summe+2^i;
}
}

Joghurt
05-01-2006, 20:29
2^i wäre 2 XOR i...
Besser:

int zahl = 0;
// Annahme: Zahl ist in str gespeichert
for(int i=0;i<strlen(str); i++) {
if (str[i] == '1')
zahl |= 1; // += 1 würde auch gehen, |= ist aber "korrekter"
zahl <<= 1;
}

Am einfachsten und besten ist es natürlich, gleich strtol zu nehmen:
long int zahl;
zahl = strtol(str, NULL, 2);

bischi
05-01-2006, 20:50
2^i wäre 2 XOR i...



Seit wann den das? Bei mir heisst das immer noch 2 hoch i... (ich mein: Wer hat denn behauptet, dass das, was da steht, c oder c++ ist? Das ist ja das schöne an Pseudo-Code...)

MfG bischi

PS: Bist du sicher, dass das XOR ist? Denn: 2^3 = 0. Exklusiv-oder würde ja bedeuten, dass ne 1 kommen müsste?! Oder ist hier 0 einfach true? Ich hab da jeweils ein riesiges Chaos - wann 1 true und wann 0 true...

Joghurt
05-01-2006, 20:55
Denn: 2^3 = 0.Bei mir kommt 1 raus...
main(){int i=2^3;printf("%i",i);}

bischi
05-01-2006, 21:01
Jaja - gibt ja ne eins... Hab mich vertippt - da stand auf einmal 3^3 da...

MfG Bischi

PS: Wo wir grad dabei sind: Wie rechne ich jetzt in c++ 2^3 richtig aus (also 2 hoch 3 wie dus in maple und co schreiben würdest?). Hab schon ne weile nicht mehr c++ geproggt...

peschmae
05-01-2006, 21:27
in C/C++ gibts dafür die Funktion pow und Abarten:
double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);

In C++ wurde die pow(double, double) zumindest fürn pow(double, int) auch noch überladen.

Ich frag mich allerdings immer noch was der OP eigentlich genau will.

MfG Peschmä

bischi
05-01-2006, 21:43
Naja - jetzt hab ichs halt schnell geproggt:


#include<iostream>


//Pre: hoch ist nicht negativ
//Post: gibt tief ^ hoch zurück
int pow(int tief, int hoch)
{
int result=tief;

if(hoch <=0){
return 1;
}


for(int i=hoch-1; i >0; i--){
result = result*tief;
}

return result;

}



int main()
{
int output=0;

int input=0;

int counter=0;

std::cout << "geben sie eine Binär-zahl ein:"<<std::endl;


std::cin >> input;


int actualDigit=0;

while(true){
actualDigit=input%10;

//Falsche Eingabe
if(actualDigit>=2){
std::cout << "error"<< std::endl;
break;
}

if(actualDigit==1){
output=output + pow(2,counter);
}

input = (input-actualDigit)/10;
counter++;

//Ende
if(input==0){
break;
}

}


std::cout << "Das resultat ist: " << output << std::endl;


return 0;

}


MfG Bischi

Joghurt
06-01-2006, 14:40
pow ist natürlich schon eingebaut, und deine Methode geht natürlich auch, normalerweise berechnet man es allerdings so (schneller)

unsigned int mypow(unsigned int a, unsigned int b)
{
int res = 1;
while (b != 0) {
res *= res;
if (b&(1<<31)) {
res *= a;
}
b<<=1;
}
return res;
}Man zerlegt
a^b = a^(b_n*2^n + b_{n-1}*2^(n-1) + ... + b_1 * 2 + b_0) = ((a^(b_n))^2 * a^(b_{n-1}))^2 * ...