# Binär in Bits umrechnen



## imperial0405 (15. Nov 2022)

Wie würdet Ihr jetzt vorgehen wenn ich darstellen wollte wie viele Bits ich für die Binärzahl brauche?


----------



## KonradN (15. Nov 2022)

Du bekommst ein int übergeben, also könntest Du hin gehen und die Anzahl der Bits von int nutzen.
Wenn nur positive Zahlen betrachtet werden sollen, dann wäre das Vorzeichenbit unnötig (also 1 Bit weniger).

Wenn die Anzahl der Bits stimmen soll, dann kannst Du
a) es natürlich programmatisch machen und es so einfach ermitteln.
b) Mathematisch - die Anzahl der Stellen kann man heraus bekommen. Dazu muss man sich nur erinnern, was denn so eine Binäre Zahl bedeutet:
die Stellen haben immer einen Wert von 2 hoch (Stelle - 1)
Bei 1000 dann ist das die 4te Stelle und damit den Wert von 2 hoch 3.
Wenn ich nun eine 1 nur mit 0er habe und das ist an Stelle x, dann ist es 2 hoch (x-1):
wert = 2 ^ (x-1)
Das kann man nach x umstellen - dazu dient der log2 ==> x-1 = log2(wert) ==> x = log2(wert)+1
Nun habe ich aber nicht nur 0er. Aber das führt dann nur zu nachkomma-Werten. Daher kann man dann einfach "abschneiden".

Jetzt muss man nur aufpassen: log2(1) = 0. Aber log2(0)? Das ist also ein Sonderfall, den man separat behandeln sollte.


----------



## Jw456 (15. Nov 2022)

```
System.out.println("Number of 1's bit are: " +Integer.bitCount(m));
```


----------



## KonradN (15. Nov 2022)

Jw456 hat gesagt.:


> ```
> System.out.println("Number of 1's bit are: " +Integer.bitCount(m));
> ```


Das ist nicht die Anzahl der Bits, die zur Darstellung benötigt werden sondern die Anzahl der 1en, die in der binären Darstellung vorkommen:


> Returns the number of one-bits in the two's complement binary representation of the specified int value. This function is sometimes referred to as the _population count_.








						Integer (Java SE 17 & JDK 17)
					

declaration: module: java.base, package: java.lang, class: Integer



					docs.oracle.com


----------



## Jw456 (15. Nov 2022)

KonradN hat gesagt.:


> Das ist nicht die Anzahl der Bits, die zur Darstellung benötigt werden sondern die Anzahl der 1en, die in der binären Darstellung vorkommen:
> 
> 
> 
> ...


Ich dachte genau das wollte er na gut dann eben nicht .

Dann hatte er es eigentlich auch schon fast , er muss  halt die Anzahlt der Durchgänge zählen.

```
int m = 96;

        int z = 0;
        while (m != 0) {
            m = m / 2;
            z++;
        }
        System.out.println(z);
```


----------



## MarvinsDepression (15. Nov 2022)

oder so ...

```
int neededBits(int x) {
    for (int i = 31; i >= 0; i--) {
        if ((x & (1 << i)) != 0) return i + 1;
    }
    return 1; // für x = 0 opfere ich auch ein Bit
}
```


----------



## KonradN (15. Nov 2022)

Also die Mathematische Lösung wäre (für positive Integer):
`int requiredBits = (int) (Math.log(x)/Math,log(2) + 1)`

Wenn man auch negative Integer betrachten möchte, dann würde noch ein Vorzeichen bit dazu kommen (also +2) und die benötigten Bits wären dann etwas wie:

```
int effectiveNumber = (number < 0) ? -number - 1 : number;
int bits = (int) (Math.log(effectiveNumber)/Math.log(2)) + 2;
```

Natürlich immer eine Prüfung auf 0 - wenn der Wert 0 ist, dann brauchen wir ohne Vorzeichen 1 Bit und mit Vorzeichen 2 Bit.


----------

