Ja code erklärung?

nyndnds - (Computer, PC, programmieren)

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

Falak  28.01.2019, 23:05

Wow hast dir ja voll die Mühe gegeben :D. Wenn das nicht als beste Antwort ausgezeichnet wird, dann weiß ich auch net :D.

0
pascalmeister 
Beitragsersteller
 29.01.2019, 00:29

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).

0
xxxcyberxxx  29.01.2019, 00:48
@pascalmeister

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

0
pascalmeister 
Beitragsersteller
 29.01.2019, 00:44

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?,

0
xxxcyberxxx  29.01.2019, 00:52
@pascalmeister

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

0
pascalmeister 
Beitragsersteller
 29.01.2019, 01:10

Wenn du mit höchste Stelle die stelle ganz links meinst habe ich es verstanden ^^

0

"&" 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);
}

Woher ich das weiß:Studium / Ausbildung – Masterstudium Elektrotechnik - Schwerpunkt Embedded Systems

pascalmeister 
Beitragsersteller
 28.01.2019, 22:17

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 ^^

0
Gehilfling  28.01.2019, 22:22
@pascalmeister

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)

0
pascalmeister 
Beitragsersteller
 28.01.2019, 22:32

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?

0
xxxcyberxxx  28.01.2019, 23:04
@Falak

Nein, das ist in dem Fall eine binäre Maske, siehe meine Antwort

1

Das ?: ist ein Operator

Ist ein Operator der 3 Operanden besitzt

sprich wie eine eine verkürze ifschleife

if (a > b)

...

else

....

c

..


pascalmeister 
Beitragsersteller
 28.01.2019, 22:19

und die 128???

0
regex9  29.01.2019, 17:05

if ist keine Schleife.

0
Falak  29.01.2019, 17:49
@regex9

Kann man dazu auch Abfrage sagen?

0
regex9  29.01.2019, 18:03
@Falak

Sowohl if, als auch Schleifen sind Anweisungen. Ugs. wird öfter Abfrage verwendet, du kannst es auch Verzweigung, Struktur, Kontrollstruktur, Bedingte Anweisung o.ä. nennen.

0