PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: Dezimal in Dual


Snowguard
2004-05-27, 12:35:52
Hi Leute
Habe ein Prob. Sollen ein Programm schreiben,das Dezimalzahlen in Dualzahlen umwandelt.
Nur habe ich ka wie das in Java geht :o(
mfg snowguard

mithrandir
2004-05-27, 12:47:01
Probier's mal so:

int intVar = 5;

System.out.println( "Dezimal: "+intVar );
System.out.println( "Binaer: "+Integer.toBinaryString( intVar ) );
bye, mith

DocEW
2004-05-27, 13:24:30
Hehe, das wird wohl kaum Sinn der Übung sein! =)
Nur mal so als Denkanstoß: Im Binärsystem haben die einzelnen Bits ja Wertigkeiten, also zum Beispiel ist das 3. Bit (von rechts) 4 "Wert", das 4. ist 8 "Wert" usw....
Was du jetzt rausfinden mußt ist, ob das Bit gesetzt werden soll, oder nicht. Dazu fängst du bei den höchstwertigen Bits an. Willst du zum Beispiel die Zahl 133 konvertieren, machst du folgendes:

8. Bit ist 128 "Wert". Also wird es zur Darstellung von 133 benötig, das 8. Bit ist also "1". Was von der Zahl noch übrig ist, ist dann 133 - 128 = 5.

7. Bit ist 64 "Wert". Ist also zu groß, um 5 darzustellen. Also ist das 7. Bit "0".
6. Bit genauso...
.
.
.
3. Bit ist 4 "Wert", also ist es "1", Rest ist 1.
2. Bit ist 2 "Wert", ist also "0" und
1. Bit ist 1 "Wert", also ist es "1" und du bist fertig.

Klar soweit (na, welcher Film? ;) )?

Pinoccio
2004-05-27, 13:46:50
Original geschrieben von DocEW
Hehe, das wird wohl kaum Sinn der Übung sein! =)

Hm, da hast du sicher Recht, aber ein Grundgedanke von OOP ist doch gerade die Wiederverwendung bzw die Wiederverwendbarkeit von Code, dem trägt
mithrandirs Beispiel Rechnung. Das man das auch ausproogrammieren kann ist ja klar ...

mfg Sebastian

mirp
2004-05-27, 17:11:15
Original geschrieben von DocEW
Hehe, das wird wohl kaum Sinn der Übung sein! =)
Nur mal so als Denkanstoß: Im Binärsystem haben die einzelnen Bits ja Wertigkeiten, also zum Beispiel ist das 3. Bit (von rechts) 4 "Wert", das 4. ist 8 "Wert" usw....
Was du jetzt rausfinden mußt ist, ob das Bit gesetzt werden soll, oder nicht. Dazu fängst du bei den höchstwertigen Bits an. Willst du zum Beispiel die Zahl 133 konvertieren, machst du folgendes:

8. Bit ist 128 "Wert". Also wird es zur Darstellung von 133 benötig, das 8. Bit ist also "1". Was von der Zahl noch übrig ist, ist dann 133 - 128 = 5.

7. Bit ist 64 "Wert". Ist also zu groß, um 5 darzustellen. Also ist das 7. Bit "0".
6. Bit genauso...
.
.
.
3. Bit ist 4 "Wert", also ist es "1", Rest ist 1.
2. Bit ist 2 "Wert", ist also "0" und
1. Bit ist 1 "Wert", also ist es "1" und du bist fertig.

Klar soweit (na, welcher Film? ;) )?
Deine Erklärung ist zwar intuitiver und besser verständlich. Nur ist dann die Implementierung etwas kompliziert. Der folgende Ansatz lässt sich einfacher umsetzen:133 div 2 = 66 Rest 1 (least significant bit)
66 div 2 = 33 Rest 0
33 div 2 = 16 Rest 1
16 div 2 = 8 Rest 0
8 div 2 = 4 Rest 0
4 div 2 = 2 Rest 0
2 div 2 = 1 Rest 0
1 div 2 = 0 Rest 1 (most significant bit)Bei Null kann man dann abbrechen und erhält 10000101.

DocEW
2004-05-27, 23:09:06
Jo, die Implementierung ist nicht so ganz einfach. Oder sagen wir mal: Konzentrationssache =) ...
Es gibt natürlich viele Möglichkeiten. Man kann z.B. auch ein logisches AND mit den Zweierpotenzen machen. Kommt die Zweierpotenz raus, ist das Bit gesetzt.

ethrandil
2004-05-27, 23:57:11
man könnte auch jeweils einmal nach rechts shiften und einmal nach links, und gucken ob die Zahlen identisch sind ;-)


wäck

ist aber ungetestet ;)

- Eth

EDIT: verbessert & getestet
EDIT2: alternative in superkurz
EDIT3: Code entfernt, weil ich ja keinen Code vorgenen darf bei Hausaufgaben!

DocEW
2004-05-28, 00:11:27
Wie wird's denn eigentlich in Integer.toBinaryString() gemacht? Hat jemand die Sourcen gerade parat und kann mal nachgucken?

ethrandil
2004-05-28, 00:20:54
Ja, hab ich grade.... das ist aber viiiel langsamer, weil allgemein *g*


/*
* @(#)Integer.java 1.84 03/12/19
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
class Integer{
[...]

public static String toBinaryString(int i) {
return toUnsignedString(i, 1);
}
[...]
private static String toUnsignedString(int i, int shift) {
char[] buf = new char[32];
int charPos = 32;
int radix = 1 << shift;
int mask = radix - 1;
do {
buf[--charPos] = digits[i & mask];
i >>>= shift;
} while (i != 0);

return new String(buf, charPos, (32 - charPos));
}
[...]
}

- Eth

P.S.:
Darf ich den Code eigentlich einfach so posten? verletzte ich da ne Lizens? *duck*
EDIT: so viel langsamer isses ja garnicht. zum füllen eines Arrays geradezu perfekt *g*

ScottManDeath
2004-05-28, 01:01:34
So hätt ich es auch gemacht vom Algortihmus her ....
...oder die Schleife aufgerollt

snowguard
2004-05-28, 20:21:24
habe da noch ne frage :o)

wie ist der befehl fürs Abrunden bei Java ?

Achill
2004-05-28, 20:31:11
Wenn die genaue Aufgabe lautete, das du ein Algorithmus zum Umwandeln von Dezimalzahlen in das Binärsystem angeben sollst, würde ich nicht den Vorschlag mit dem verschieben und auslesen der Bits nehmen, da es in dem Sinne keine Algorithmus der Umwandlung ist. Man nuzt hier ja nur aus, dass die Zahl im Rechenwerk binär codiert ist - es ist also keine Umwandlung von einer Darstellung in die andere, sondern reines Auslesen ... ;)

@mirp, der ist zwar leichter zu implementieren und sollte auch deutlich schneller zur Laufzeit sein - er ist aber glaube ich schwerer zu verstehen ... dafür natürlich universell für alle Zahlensysteme einsetzbar.

ethrandil
2004-05-28, 20:37:07
Original geschrieben von snowguard
wie ist der befehl fürs Abrunden bei Java ?
So weit ich weiß kann Java nicht abrunden.
ab 1.1 wird sofort auf 2 aufgerundet.

Du kannst ja aber so runden wie du gerne möchtest:

GerundeteZahl sei die aufgerundete OriginalZahl.
Falls GerundeteZahl-OriginalZahl größer als 0,5 ist
zieh von GerundeteZahl Eins ab.

- Eth

mirp
2004-05-28, 20:46:47
Original geschrieben von Achill

@mirp, der ist zwar leichter zu implementieren und sollte auch deutlich schneller zur Laufzeit sein - er ist aber glaube ich schwerer zu verstehen ... dafür natürlich universell für alle Zahlensysteme einsetzbar.
Ja, das hatte ich ja auch geschrieben. Der erste Vorschlag ist leichter zu verstehen.

HellHorse
2004-05-29, 01:24:07
Original geschrieben von snowguard
habe da noch ne frage :o)

wie ist der befehl fürs Abrunden bei Java ?
Math.floor (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Math.html#floor(double))
Allerdings wird bei der Konversion von Gleitkomma zu Ganzzahl automatisch der Nachkommateil entfernt, was zum gleichen Ergebnis führt.