# 32 Bit Binärzahl Umwandeln in Dezimal



## Peterpain (11. Nov 2017)

Hallo,

ich habe folgendes Problem:
Ich soll über Integer.parseInt(args[0]) von der Kommandozeile eine 32Bit Dualzahl einlesen und diese in Dezimal umwandeln. 
Das ganze funktioniert noch ganz einfach indem man den Radix 2 dazu angibt
Bsp: Integer.parseInt(args[0],2) 
Aber wie verändere ich das ganze wenn der erste bit das vorzeichen angibt (Zweierkomplementdarstellung)?
Habe mir auch schon überlegt die ganze Dualzahl über einen String auszurechnen, Strings dürfen wir aber noch nicht verwenden, da es noch kein Teil der Vorlesung war.

Schonmal vielen dank für eure Hilfe


----------



## krgewb (11. Nov 2017)

Du kannst es berechnen lassen. Die Binärzahl sei z.B. 100110.


```
1    0    0   1   1   0
1*32+0*16+0*8+1*4+1*2+0*1
=38
```

Nochmal genauer:

```
1     0     0     1     1     0
1*2^5+0*2^4+0*2^3+1*2^2+1*2^1+0*2^0
=38
```


----------



## Peterpain (11. Nov 2017)

ich habe mich wohl missverständlich ausgedrückt.
Das erste bit der Binärzahl ( in deinem beispiel die "32") wäre in in der Zweierkomplementdarstellung keine 32 sondern ein - (minus).
Mir ist sehr wohl bekannt wie man Binär in dezimal umrechnet, aber es geht um den Präzisen fall in Java mit einer zusammenhängenden Binärzahl in der Zweierkomplementdarstellung eingelesen über parseint


----------



## Robat (11. Nov 2017)

Wieso gehst du nicht über `Long.parseLong(..)`?
Das kannst du danach wieder zu einem int casten.


----------



## Meniskusschaden (11. Nov 2017)

Peterpain hat gesagt.:


> Das erste bit der Binärzahl ( in deinem beispiel die "32") wäre in in der Zweierkomplementdarstellung keine 32 sondern ein - (minus).


Na ja, bei einer 32-Bit Zahl wäre es schon die 32, weil es da ja gar nicht das erste Bit wäre. Und das erste Bit würde auch nicht für - stehen, sondern für -(2^31), also -2.147.483.648.
Du könntest statt `Integer.parseInt()` auch `Integer.parseUnsignedInt()` verwenden. Aber ich kann mir eigentlich nicht vorstellen, dass das so gedacht ist, sondern dass ihr das selber berechnen sollt.


----------



## Peterpain (11. Nov 2017)

Robat hat gesagt.:


> Wieso gehst du nicht über `Long.parseLong(..)`?
> Das kannst du danach wieder zu einem int casten.


Auch leider nicht teil der Vorlesung


Meniskusschaden hat gesagt.:


> Na ja, bei einer 32-Bit Zahl wäre es schon die 32, weil es da ja gar nicht das erste Bit wäre. Und das erste Bit würde auch nicht für - stehen, sondern für -(2^31), also -2.147.483.648.
> Du könntest statt `Integer.parseInt()` auch `Integer.parseUnsignedInt()` verwenden. Aber ich kann mir eigentlich nicht vorstellen, dass das so gedacht ist, sondern dass ihr das selber berechnen sollt.


Auch Integer.parseUnsignedInt() ist nicht erlaubt.
Alles soll noch sehr primitiv berechnet werden. Ich stoße nur immer wieder auf das Problem, das 11111111....(32 einsen) nicht in einen integer passen.


----------



## Meniskusschaden (11. Nov 2017)

Peterpain hat gesagt.:


> Strings dürfen wir aber noch nicht verwenden, da es noch kein Teil der Vorlesung war.


Und was ist `args[0]`?


Peterpain hat gesagt.:


> Ich stoße nur immer wieder auf das Problem, das 11111111....(32 einsen) nicht in einen integer passen.


Dann nimm doch nur die letzten 31 Bit und korrigiere das Ergebnis abhängig vom ersten Bit. Mir ist aber nicht klar, in welcher Weise String-Operationen unzulässig sind.


----------



## krgewb (11. Nov 2017)

1111111111111111111111111111111 entspricht 2.147.483.647.
Ich dachte, in Java geht Integer von -2.147.483.648 bis 2.147.483.647 !?


----------



## Meniskusschaden (11. Nov 2017)

krgewb hat gesagt.:


> 1111111111111111111111111111111 entspricht 2.147.483.647.
> Ich dachte, in Java geht Integer von -2.147.483.648 bis 2.147.483.647 !?


Ja, das stimmt auch. Aber `Integer.parseInt("1000000000000000000000000000000000000000", 2)` funktioniert nicht mehr.


----------

