Bei Java Dezimal in Binärzahlen umwandeln ohne die Funktion "Integer.toBinaryString?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich würde es so lösen. (Funktioniert aber nur für positive Integer. Leider gibt es in Java ja keine unsigned-Typen.)

public class Test {

public static void main(String[] args) {
int number = 1337;
String s = "";

while (number > 0) {
int lsb = number & 1;

if (lsb != 0)
s = "1" + s;
else
s = "0" + s;

number >>= 1;
}

System.out.println(s);
}

}

NoHumanBeing  27.10.2017, 12:00

Wenn Du ne feste Bitlänge haben willst, machst Du aus der while-Schleife einfach ne for-Schleife.

for (int i = 0; i < n; i++) {
...
}

Wobei n die Zahl der Bits ist, die Du ausgeben möchtest.

Den Schleifenkörper lässt Du so, wie er ist, einschließlich dem Shiften von number.

Wenn die Zahl dann tatsächlich "kürzer" ist, wird sie links mit Nullen aufgefüllt. Wenn die Zahl tatsächlich "länger" ist, werden nur die n "niederwertigsten" Bits (LSBs) ausgegeben.

Das selbe würde übrigens passieren, wenn Du die Zahl auf einen "kleineren" Datentyp casten würdest. Die LSBs zu erhalten ist also nicht einmal wilkürlich, sondern sogar so ziemlich das sinnvollste, was Du tun kannst, wenn Du die Zahl nicht als ganzes ausgeben kannst/sollst.

1
Kieselsaeure  27.10.2017, 13:41

MOMENT MAL.. java hat kein unsigned???? ein glück stecke ich schon in ner gummizelle und kann mir hier nirgends den kopf anschlagen.

1
NoHumanBeing  27.10.2017, 13:55
@Kieselsaeure

MOMENT MAL.. java hat kein unsigned????

Korrekt. :-)

Ich weiß, es ist total doof, aber es ist tatsächlich so. :-)

3
Kayak2503 
Fragesteller
 28.10.2017, 22:19

was bewirkt in deinem beispiel das&?

1
NoHumanBeing  28.10.2017, 22:29
@Kayak2503

Bitweise Und-Verknüpfung mit einer eins.

Sagen wir, wir haben die Zahl 1337.

Die sieht binär wie folgt aus.

0000 0000 0000 0000 0000 0101 0011 1001

Jetzt möchte ich wissen, ob das niedrigste Bit (also das ganz "rechts") eins ist.

Um das feststellen zu können, maskiere ich alle anderen Bits aus. Genau hierfür brauche ich die Und-Verknüpfung.

0000 0000 0000 0000 0000 0101 0011 1001
AND
0000 0000 0000 0000 0000 0000 0000 0001
=
0000 0000 0000 0000 0000 0000 0000 0001

Das Ergebnis ist ungleich null, also weiß ich, dass das Bit ganz rechts eine eins ist. Also schreibe ich eine "1" in den String.

"1" + "" = "1"

(Hätte ich das einzelne Bit nicht per Und-Verknüpfung "isoliert", hätte ich mit der Vergleichsoperation lediglich herausfinden können, ob ein beliebiges Bit ungleich null wäre. Das nützt mir aber nichts. Deshalb muss ich alle anderen Bits "ausmaskieren".)

Dann shifte ich die Zahl um eine Stelle nach rechts.

0000 0000 0000 0000 0000 0101 0011 1001
0000 0000 0000 0000 0000 0010 1001 1100

Und dann wieder von vorne.

0000 0000 0000 0000 0000 0010 1001 1100
AND
0000 0000 0000 0000 0000 0000 0000 0001
=
0000 0000 0000 0000 0000 0000 0000 0000

Und das ist gleich null, also weiß ich, dass das zweite Bit von rechts eine null ist. Also hänge ich "links" eine "0" an den String.

"0" + "1" = "01"

Und so weiter.

Du siehst schon, wie das ganze läuft. Wenn ich durch bin, steht im String "10100111001", wie man es erwartet. ;-)

1

Also der Weg, den ich kenne, wäre folgender:

int zahl = 4;
String result = "";

while (zahl > 0)
{
  int remainder = zahl % 2;
  zahl = zahl / 2;
  result = remainder.toString() + result;
}

zahl == 4 => 4 % 2 == 0 => result = "0", zahl /= 2 == 2
zahl == 2 => 2 % 2 == 0 => result = "00", zahl /= 2 == 1
zahl == 1 => 1 % 2 == 1 => result = "100", zahl /= 2 == 0

Fertig.

Achtung: Der letzte Schritt mit 1 /= 2 == 0 funktioniert nur wegen der Integer-Division!



NoHumanBeing  27.10.2017, 11:53

Das funktioniert prinzipiell auch.

Nur ...

remainder.toString()

... funktioniert nicht, da ein int kein Objekt ist und man daher keine Methode darauf aufrufen kann.

Richtig wäre die statische Methode ...

Integer.toString(remainder)

... der Klasse Integer.

3
ohwehohach  27.10.2017, 12:12
@NoHumanBeing

Hast Recht. Mein Java rostet etwas, seit ich hauptberuflich in C# unterwegs bin :-D

3

Machs doch einfach mit & und <<


NoHumanBeing  27.10.2017, 11:51

Oder mit & und >>. ;-)

(Siehe meine Antwort. :-P )

0