Ja code erklärung?
Hey, Es geht darum Text in Bits umzuwandeln...
Ich verstehe den Teil in der Mitte nicht?!
for und for each schleifen kenne ich aber was ist dieses “?” oder 0:1 etc???
Warum funktioniert dieser code??

3 Antworten
Da es bei dir ja bei Zeile 51 und 52 hängt:
binary.append((val & 128) == 0 ? 0 : 1);
val <<= 1;
Teilen wir das ganze mal auf: An sich kann man das ganze auch umschreiben:
Das Bedingung ? Wenn Wahr : Wenn Falsch nennt sich Ternärer Operator und ist nur eine andere Schreibweise. Man kann es auch so schreiben:
if( (val & 128) == 0) {
binary.append(0);
} else {
binary.append(1);
}
val <<= 1;
Jetzt sind es noch das (val & 128) == 0 und val <<= 1;
Das einfache & ist ein bitweises und, die 128 die "Maske", die überprüft wird. In Kombination nennt man das Bit Masking
Da val immer ein byte ist und somit 8 Stellen hat, viele davon aber irrelevant sind, schaut man immer nur, ob eine Stelle den Wert 0 hat.
128 ist binär 10000000. Bei einem Binären und wird nun die binäre Darstellung von val mit der Maske abgeglichen. Pro Stelle ist das Ergebnis genau dann 1, wenn val und die Maske eine 1 enthalten
Als Beispiel hierfür z.B.
10110101 //181
& 01110110 //118
--------
= 00110100 //52
Hier wird dann z.B. folgendes gemacht:
11111111 //val
& 10000000 //Maske 128
--------
= 10000000 //Ergbenis
Somit bleibt noch val <<= 1;
Auch dies kann man anders Schreiben, und zwar
val = val << 1;
Was hier passiert, nennt sich Bit Shifting.
hierbei wird val wieder binär betrachtet. Nehmen wir mal an, val wäre momentan 10110101. Was macht Shifting? Es "bewegt" das ganze Pattern in die Pfeilrichtung und fügt eine 0 am anderen Ende hinzu. Die Zahl hinter den Pfeilen gibt an, wie viele 0en dazukommen. Somit wäre das Pattern nun 101101010. Da dies nun eine Stelle zu viel für ein byte ist, wird die vordere Stelle gelöscht - die Zahl ist nach einem Shift um eins 01101010.
Beispiel:
int val=0b00000001; //x ist 0b00000001
System.out.println(val); //1
x <<= 1;
System.out.println(x); //2
x <<= 1;
System.out.println(x); //4
x <<= 3; //x ist nun 0b00100000
System.out.println(x); //32
x >>= 5; //geht auch in die andere Richtung
System.out.println(x); //1
Wenn du mit höchste Stelle die stelle ganz links meinst habe ich es verstanden ^^
Nun ja, das ist genau die Bedingung, die überprüft wird - in diesem Fall wär das ergebnis false.
Die Maske b ist in diesem Fall aber 128 - dh es wird von jedem a immer nur die höchste binäre Stelle betrachtet. Wenn diese eine Stelle nun 1 ist, ist es false - ist diese Stelle 0, ist es true
Sehr gute erklärung!
Geht nicht sowas wie:
für jeden bit in byte , binary.append(bit)
?^^ sowas wäre doch chillig.
Ich weiß leider nicht warum das mit dem shiften funktioniert (mathematisch).
soweit ich weiß, gibt es dafür keine Funktion (für jedes bit in einem Byte), weshalb immer der Shift erfolgt.
Ich weiß leider nicht warum das mit dem shiften funktioniert (mathematisch).
Nun ja, fangen wir mal einfach an. Eine Binärstelle entspricht einer Zweierpotenz mit 2^0 an ganz rechter Stelle
Somit haben wir für 11111111 die Werte 128, 64, 32, 16, 8, 4, 2 und 1 - oder, um es anders auszudrücken: 2^7, 2^6, 2^5, 2^4, 2^3, 2^2, 2^1 und 2^0
Ein Shift (<<) um den Wert i multipliziert jeden dieser Werte mit 2^(i-1). Bei einem Shift um 1 wird also daraus 2^8, 2^7, 2^6, ... 2^1
Wow hast dir ja voll die Mühe gegeben :D. Wenn das nicht als beste Antwort ausgezeichnet wird, dann weiß ich auch net :D.
"&" ist ein binärer Operator, der "val" binär mit 128 ver"und"et (True, sofern alle 1en aus val mit einer 1 in 128 übereinstimmen).
Das mit dem Fragezeichen ist eine Form der "If, else" abfrage:
Bedingung ? True : False. Oder auch in deinem Fall:
if ((val&128) == true)
{
binary.append(0);
}
else
{
binary.append(1);
}
Ich verstehe es leider nur zu 90% Mir fehlt noch der Sprung das zu verstehen;
(val & 128) == 0
Das sind doch 2 Zahlen und 128 ist niemals gleich 0.. :() Und warum nimmt man die 128?
Nein, das ist in dem Fall eine binäre Maske, siehe meine Antwort
ver und et?
könntest du mir evtl zeile 50 und 51 genauer beschreiben? :/ weiß nichtmal was ich da googlen könnte . so schwer wird es am ende eh nicht sein ^^
Beispiel für binäres und:
val = 0b1001 0101; (=149,dec)
128 = 0b1000 0000;
Binär "und" ergibt das "false," da nur das höchstwertige Bit gleich ist, die anderen 1en nicht. Sieh dir dazu Wahrheitstabellen an, wenn du das nicht verstehst.
Zeile 51 schiebt das Ergebnis aus val um 1 bit nach links:
val = 0b0101 0101 => 0b1010 1010 (linke 1en fallen "raus", rechts rücken 0en nach)
Das ?: ist ein Operator
Ist ein Operator der 3 Operanden besitztsprich wie eine eine verkürze ifschleife
if (a > b)
...
else
....
c
..
bzw. ich hab grad gegooglet:
Wenn a = 0011 1100
Und b = 0000 1101
dann a&b = 0000 1100
Jetzt steht im code aber:
(a&b)==0
wie kann denn
00001100 == 0 sein?,