Verständnisfrage zur Zahlenumwandlung (Dezimal-->Dual)

Mr.Pink!

Mitglied
Servus,

bin gerade dabei mir folgenden Code für ein Programm, das Dezimal- in Dualzahlen umwandeln soll, zu erarbeiten:

Java:
import java.util.Scanner;
public class Aufgabe_7 {
public static void main(String[] args) {
// Definition der und Ausgabevariable
long dualzahl = 0;
// Eingabe der Shortzahl
Scanner eingabe = new Scanner (System.in);
System.out.print("Bitte shortzahl eingeben
(zwischen -32768 und 32767): ");
short shortzahl = eingabe.nextShort();
System.out.println();
// Unterscheidung für positive und negative Zahlen
if (shortzahl >= 0) {
for (int i = 0; i < 16; i++) {
dualzahl = (long) (dualzahl + ((shortzahl % 2) *
Math.pow(10, i)));
shortzahl = (short) (shortzahl / 2);
}
} else {
shortzahl = (short) (shortzahl + 32768);
for (int j = 0; j < 16; j++) {
dualzahl = (long) (dualzahl + ((shortzahl % 2) *
Math.pow(10, j)));
shortzahl = (short) (shortzahl / 2);
}
dualzahl = (long) (dualzahl + Math.pow(10, 15));
}
// Ausgabe Dualzahl
System.out.println("Darstellung als Dualzahl: " +dualzahl);
}
}

ich bin momentan dabei, die Umwandlung der positiven Zahlen nachvollziehen zu können, verstehe aber nicht, warum der Index in der Schleife bis 16 geht (Zeile 14) und warum man den Rest nochmal mit 10^i multiplizieren muss (Zeile 16).

Mit einer Antwort eurerseits, wäre mir sicherlich sehr geholfen;-)

Danke und lG
 

Steff87

Aktives Mitglied
Müssen es umbedingt Short zahlen sein?
Wenn es auch mit Int gehen würde, würde ich dir empfehlen die funktion "Integer.toBinaryString(int i)".
Die lierfert dir einen String mit der entsprechenden Binärzahl zurück.
 

Steff87

Aktives Mitglied
nicht ganz. ein Integer hat 32 bit wohingegen ein short nur 16 Bit hat. Somit werden negative short-Zahlen falsch dargestellt, da diese beim int noch positiv sind.
 

AmunRa

Gesperrter Benutzer
Also im positiven Bereich ist wirklich kein Unterschied, im Negativen Bereich muss man einfach die hinteren 16 Werte lesen.

Java:
		        short s = 56;
		        int i = 56;
		        System.out.println(Integer.toBinaryString(s));
		        System.out.println(Integer.toBinaryString(i));
		        s=-45;
		        i=-45;
		        System.out.println(Integer.toBinaryString(s).substring(16));
		        System.out.println(Integer.toBinaryString(i));
 

akimoon

Aktives Mitglied
Also im positiven Bereich ist wirklich kein Unterschied, im Negativen Bereich muss man einfach die hinteren 16 Werte lesen.

Java:
		        short s = 56;
		        int i = 56;
		        System.out.println(Integer.toBinaryString(s));
		        System.out.println(Integer.toBinaryString(i));
		        s=-45;
		        i=-45;
		        System.out.println(Integer.toBinaryString(s).substring(16));
		        System.out.println(Integer.toBinaryString(i));

Da bekomme ich die Ausgabe:
Code:
1111111111010011
11111111111111111111111111010011
was mir ein bisschen viel erscheint? ???:L

Wie wäre es einfach mit:

Java:
System.out.println(Integer.toString(s, 2));
System.out.println(Integer.toString(i,2));

Aber zurück zum 1. Posting:
Das 10^15 kommt hinzu, da ein long (soviel ich weiß) 32 bits hat und deine Zahl vorher nur 16 bits. So werden die ersten 16 Bits aufgefüllt denk ich :)
 

AmunRa

Gesperrter Benutzer
was mir ein bisschen viel erscheint?
Du weißt schon wie in Java negative Zahlen dargestellt werden?

Ansonsten bitte hier nachlesen
Wie wäre es einfach mit:


Java:
System.out.println(Integer.toString(s, 2));
System.out.println(Integer.toString(i,2));

ja das ist auch eine Möglichkeit liefert aber einfach eine andere Representation einer Binär zahl.
Welche die richtige ist, kann nur der TO entscheiden.

da ein long (soviel ich weiß) 32 bits hat

ein long hat 64 bits. ein int hat 32


@ TO diese Rechnungen kommen daher dass du die einsen an die Richtige stelle schieben kannst. zuerst errechnest du dir in deinem Programm ob die nächste Position der Zahl eine 1 oder 0 ist.

und anschliesend addierst du diese Zahl zu deinem bisherigen ergebnis.
nehmen wie die zahl 3 welche binär 11 ist. zuerst. errechnen wir eine 1 und speichern diese in deinem ergebnis ab. im zweiten Schritt errechnen wir wieder eine eins und nun müssen wir diese an die 10er Stelle deiner dualzahl stellen. daher multiplizieren wird diese zahl mit 10 also 10^1

wenn wir annehmen dass wir diese an diese an die vierte Position stellen müssten. würden wir mit 10^3 multiplizieren. da ein short eben aus maximal 15 Bits besteht (in Java wird das 16 Bit als vorzeichen gesehen) muss höchstens mit 10^15 multiplizieren
 
Zuletzt bearbeitet:

Mr.Pink!

Mitglied
Hallo und danke für eure Antworten.
Die Umwandlungsmethode möchte ich nicht nehmen, weil ich die Logik dahinter verstehen will.
Wenn ich Zeile 13-17 mal manuell durchgehe anhand der shortzahl 5, bekomme ich leider eine andere Zahl heraus, wie das Programm, könnt ihr das vielleicht mal kontrollieren bitte:
i = 0
dualzahl = 0 + 1*10^0
shortzahl = 2

i = 1
dualzahl = 0 + 1*10^0 + 0*10^1
shortzahl = 2

i = 2
dualzahl = 0 + 1*10^0 + 0*10^1 + 0*10^2

statt 0101 kommt bei mir jetzt 0100 raus, aber das ist falsch, kann mir da wer helfen?

Danke und lG
 

Steff87

Aktives Mitglied
Dann sieht das ganze danach aus, dass die Halbierung nicht hanz richtig ist. So wich ich das gesehen habe ist
i = 0
dualzahl = 0 + 1*10^0
shortzahl = 2

i = 1
dualzahl = 0 + 1*10^0 + 0*10^1
shortzahl = 2

i = 2
dualzahl = 0 + 1*10^0 + 0*10^1 + 0*10^2
deine Debugausgabe, wobei bei i=0 das ergebnis stimmt, aber bei i=1 sollte 1 bei shortzahl stehen.
Hast du an deinem Code etwas verändert? Denn der Code am anfang des Themas funktioniert doch eingentlich schon.
 

Mr.Pink!

Mitglied
Also ich habe genau folgenden Code für Zahlen>0:
Java:
import java.util.Scanner;
public class Nr7 {
	public static void main(String[] args) {
		Scanner eingabe = new Scanner(System.in);
		System.out.println("Bitte geben Sie eine Shortzahl zwischen -32.768 und 32.767 ein: ");
		short shortzahl = eingabe.nextShort();
		long dualzahl = 0;
		
		for (int i = 0; i < 16; i++) {
			dualzahl = (long) (dualzahl + ((shortzahl % 2) * Math.pow(10, i)));
			shortzahl = (short) (shortzahl / 2);
		}
		
	System.out.println("Dartellung als Dualzahl " + dualzahl);
	}
}

Der Code ist genau derselbe wie oben, nur kommt bei mir als Ausgabe 11 heraus, wenn ich 3 eingebe...

Edit: habe gerade bemerkt, dass die Zahl an sich richtig ist, er schneidet nur vorne die Nullen ab, kann man das beheben, also so, dass er z.B. für 3 0011 ausgibt und nicht nur 11?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ohne alles gelesen zu haben:
inwiefern ist die richtige (!) Ausgabe 11 zur Eingabe 3 ein Problem?

edit: zum edit: z.B. in String umwandeln, nach Länge vorne "0"en ergänzen
 
S

SlaterB

Gast
deswegen ja nicht "vorne zwei "0"en ergänzen", sondern "nach Länge vorne "0"en ergänzen",

schau dir an wie lang der String ist und ergänze so viele "0"en wie nötig, z.B. per Schleife
 

Mr.Pink!

Mitglied
OK,
ich bin am überlegen, ob man auch die 2er-Komplementbildung in Java umsetzen kann für die negativen Zahlen.
Das würde heißen positive Dualzahl nehmen, 0 und 1 vertauschen und 1 addieren, muss ich die Zahl dann auch in einen String umwandeln oder geht das auch anders?
 

Mr.Pink!

Mitglied
Morgen,

also ich versuche es gerade folgendermaßen:
1. Dualzahl in String umwandeln
2. Mittels for-Schleife die einzelnen Stellen durchlaufen (charAt(Schleifenvariable))
3. Mittels if-Anweisung 0 in 1 und 1 in 0 umwandeln

Das Problem: irgendwie funktioniert diese Vorgehensweise nicht so ganz, was mache ich falsch?

Hier noch der Ausschnitt aus dem Coding:
Java:
 else {
			for (int j = 0; j < 16; j++) {
				dualzahl = (long) (dualzahl + ((shortzahl % 2) * Math.pow(10, j)));
				shortzahl = (short) (shortzahl / 2);
			}
		int [] negdualzahl =;
			for (int k = 0; k > negdualzahl.length(); k++) {
				if (negdualzahl.charAt(k)==0) {
					negdualzahl.charAt(k) = 1;

Bitte um Hilfe.
 
S

SlaterB

Gast
ist negdualzahl irgendein Array oder ein String?..

char '0' != int 0

einem String kann man mit z.charAt(k) = xy; natürlich nichts zuweisen,
Grundkenntnisse? char[] oder StringBuilder vielleicht

die Schleifendefinition zu k ist ja auch schlimm, passt denn gar nix?
 
Zuletzt bearbeitet von einem Moderator:

Mr.Pink!

Mitglied
Java:
String negdualzahl = String.valueOf(dualzahl);
			for (int k = 0; k > negdualzahl.length(); k++) {
				if (negdualzahl.charAt(k)== 0) {
					negdualzahl.charAt(k) = 1 
				}

negdualzahl sollte kein Array sein, habe da das falsche kopiert.

Wie ich einem String etwas zuweisen kann und warum die Schleifendefinition "schlimm" sein soll, kann ich nicht nachvollziehen, bin kein Java-Experte wie du, also kannst du das bitte nochmal in für mich verständliche Worte fassen?

Danke!
 

Steff87

Aktives Mitglied
Java:
String negdualzahl = String.valueOf(dualzahl);
			for (int k = 0; k > negdualzahl.length(); k++) {
				if (negdualzahl.charAt(k)== 0) {
					negdualzahl.charAt(k) = 1 
				}

Die Schleife wird so, wie du sie verwendest nie durchlaufen. Denk mal genau nach. Die Schleifenabbruchbedingung ist nicht ganz richtig.

Außerdem ist die Zuweisung von Zahlen einem Charwert auch nicht richtig. Die Zahl wird als Buschstabe interpretiert, der an dieser Stelle in der ASCII-Tabelle ist. Du musst den Wert als Character übergeben, aber auch nicht so, wie du es momentan machst.
Schreib lieber das ganze in eine zweite Variable, in der du das Ergebnis schreibst.
 

jgh

Top Contributor
Java:
 for (int k = 0; k > negdualzahl.length(); k++) {

du sagst
Code:
k=0
und solange
Code:
k echtGrößer (>) als die länge der negdualzahl
ist, erhöhe
Code:
k um 1!

erstens wird wird er niemals in die for-Schleife springen...es sei denn, die Länge von negdualzahl ist negativ und selbst wenn er es machen würde, dann kommt er niemals aus der Schleife wieder raus.

also => Vorzeichen drehen!

edit to late :(

wenn deine dualzahl ein int bspw ist:

Java:
	int dualzahl = 1010;
		String negdualzahl = String.valueOf(dualzahl);
		StringBuffer sb = new StringBuffer();
		for (int k = 0; k < negdualzahl.length(); k++) {
			if (negdualzahl.charAt(k) == '1') {
				sb.append("0");
			} else {
				sb.append("1");
			}
		}
		System.out.println(sb.toString());
 
Zuletzt bearbeitet:

Mr.Pink!

Mitglied
Sorry, das mit dem >-Zeichen war nur ein Flüchtigkeitsfehler...

Warum muss man denn ausgerechnet die Klasse StringBuffer verwenden? Das ist doch eigentlich nur eine variable Zeichenkette, deren Länge sich automatisch vergrößert im Gegensatz zur Klasse String?

Schönes Wochenende!

Edit: kann mir jemand bitte nochmal erklären, warum bei der Anfangslösung bei den negativen Zahlen nochmal + 35768 und am Ende nochmal + 10^15 gerechnet wird?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
A Verständnisfrage Java Basics - Anfänger-Themen 12
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
P Verständnisfrage: PageFactory.initElements Java Basics - Anfänger-Themen 2
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
G while.next() Verständnisfrage Java Basics - Anfänger-Themen 16
Vivien Kurze Verständnisfrage zu Java Point aus java.awt.* Java Basics - Anfänger-Themen 5
C Erste Schritte Anfänger Verständnisfrage zum Compiler Java Basics - Anfänger-Themen 31
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
J Verständnisfrage zu throws neben Funktionen Java Basics - Anfänger-Themen 2
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
P Verständnisfrage zum Mapping Java Basics - Anfänger-Themen 3
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Verständnisfrage zur Konsolenausgabe Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
S Verständnisfrage lokale Ordnerpfade Java Basics - Anfänger-Themen 1
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
O Anfänger, Verständnisfrage Java Basics - Anfänger-Themen 3
C Verständnisfrage zu Modulo Java Basics - Anfänger-Themen 6
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
L Verständnisfrage - Speicherabbild Java Basics - Anfänger-Themen 4
melly_ Verständnisfrage zu args Java Basics - Anfänger-Themen 3
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
K Verständnisfrage eines Abschnitts Java Basics - Anfänger-Themen 6
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
JavaTalksToMe Erste Schritte Println-Frage (Verständnisfrage) Java Basics - Anfänger-Themen 1
R Verständnisfrage zu Objekten u. Übergabeparameter Java Basics - Anfänger-Themen 8
G Collections Verständnisfrage zur For-Each-Schleife Java Basics - Anfänger-Themen 7
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
G Verständnisfrage zu for-each Java Basics - Anfänger-Themen 4
DontFeedTheTroll Erste Schritte Verständnisfrage zu If-Anweisung Java Basics - Anfänger-Themen 7
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
Z Verständnisfrage Anfängerprogramm Java Basics - Anfänger-Themen 0
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
G Methoden Verständnisfrage zur Methoden Java Basics - Anfänger-Themen 7
LionAge Kapselung, Verständnisfrage zur Objekterzeugung Java Basics - Anfänger-Themen 4
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
R OOP / Verständnisfrage zum Konstuktor (siehe code) Java Basics - Anfänger-Themen 7
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
A Verständnisfrage - Koordinatenumrechnung Java Basics - Anfänger-Themen 9
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage Array Java Basics - Anfänger-Themen 2
I Interface Verständnisfrage Interfaces (Bsp.: Enumeration) Java Basics - Anfänger-Themen 2
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
P Verständnisfrage Java Basics - Anfänger-Themen 3
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
D Input/Output Verständnisfrage Verzeichnis-/Dateiliste erstellen & Dateikonvertierung Java Basics - Anfänger-Themen 1
S Verständnisfrage zu Anweisungen und deren Wirkung Java Basics - Anfänger-Themen 7
H Verständnisfrage für oder Anweisung Java Basics - Anfänger-Themen 8
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage zu Java-Ausgabe Java Basics - Anfänger-Themen 3
S Verständnisfrage Java Basics - Anfänger-Themen 2
N Verständnisfrage Code Java Basics - Anfänger-Themen 8
B Verständnisfrage Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Verständnisfrage Codezeile Java Basics - Anfänger-Themen 7
B Verständnisfrage:Beispielprogramm BlueJ Java Basics - Anfänger-Themen 3
M Kurze Verständnisfrage zu einer Java Aufgabe Java Basics - Anfänger-Themen 12
K Erste Schritte Kleine Verständnisfrage Java Basics - Anfänger-Themen 12
R Verständnisfrage Referenzvariablen in array Java Basics - Anfänger-Themen 3
M Verständnisfrage: Objekt erzeugen u. zuweisen Java Basics - Anfänger-Themen 16
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
S Verständnisfrage: Exception Gebrauch Java Basics - Anfänger-Themen 2
R Verständnisfrage NPE Java Basics - Anfänger-Themen 5
P Java Objekte - Verständnisfrage Java Basics - Anfänger-Themen 9
N Verständnisfrage zu folgendem Programm Java Basics - Anfänger-Themen 2
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
S Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 2
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
M Verständnisfrage im Umgang mit Map Java Basics - Anfänger-Themen 10
K Verständnisfrage zu int.length und String.length() Java Basics - Anfänger-Themen 4
G 2D Array gleichsetzen verständnisfrage Java Basics - Anfänger-Themen 2
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
E Verständnisfrage zu Shutdownhook Java Basics - Anfänger-Themen 5
D Verständnisfrage: Java und MySql Java Basics - Anfänger-Themen 3
F Rekursion Verständnisfrage Java Basics - Anfänger-Themen 6
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
D Verständnisfrage zu Funktionen Java Basics - Anfänger-Themen 6
H Verständnisfrage Persistenz Java Basics - Anfänger-Themen 10
neurox Verständnisfrage zu Threads Java Basics - Anfänger-Themen 4
E Verständnisfrage Syntax: frame.getContentPane().add(button) Java Basics - Anfänger-Themen 11
Y Kleine Verständnisfrage zum Thema dynamische Polymorphie Java Basics - Anfänger-Themen 3
F Verständnisfrage Objekt instanzierung / Polymorphie Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben