Clanintern Clanintern Clanintern

Forum

Öffentliche Foren
FORUM: Spiele & Computer THEMA: Welchen Wert liefern diese c-Ausdrücke:
AUTOR BEITRAG
Earth - Däääh

RANG Master of Clanintern

#1 - 15.01 16:03

code:
0x37fe5027 & (~1)

code:
7 << 3

code:
(-1) >> 3

code:
(1 & (-1)) | 2

code:
(0x4711 >> 8) | ((0x4711 & 0xFF) << 8)


Die Frage stehet eigenlich schon im Topic. Was noch ganz ganz nützlich wäre wenn ihr mir verraten würde wie man auf die Lösung kommt. Vielen Dank!
Huri-Kane

RANG Deckschrubber

#2 - 15.01 18:58

1. kann ich dir nix sagen, weil ich mit c nicht so viel am hut hab, als das ich wüsste, was die tilde bedeutet.

2. heißt, dass das binäre äquivalent zu 7 (also 111) um drei bit nach links verschoben wird, also zu 111000. das ergibt dann 56.

3. links shift um drei bit, allerdings für eine negative zahl. diese wird binär im sog. zweierkomplement dargestellt, wodurch -1 binär 1...1 1111 entspricht (die anzahl vorangestellter einsen hängt von der bitbreite des gesamten datenworts ab). also wird dieser binäre wert eben um drei bit nach rechts verschoben. die frage ist dabei nur, was mit dem vorzeichen-bit ganz links geschieht. darum wird zwischen einem arithmetischen und einem logischen rechts-shift unterschieden. bei ersterem wird das aktuelle vorzeichen "kopiert", beim anderen wird konsequent mit 0 aufgefüllt. ich bin mit aus genannten gründen nicht sicher, was c da anstellt, aber bei einem arithmetischen rechts-shift würde dann sowas rauskommen: 1111 1...1 1111, was wiederum einer -1 entspricht. beim logischen shift wäre dies 0001 1...1 1111, was 536.870.911 entspricht.

4. (1 & (-1)) ergibt 1, das wiederum oder-verknüpft mit 2 ergibt 3
code:

 1 = 0001
-1 = 1111
--------- AND
     0001 = 1
 2 = 0010
--------- OR
     0011 = 3


5. step by step wie in 4.
code:

0x4711 >> 8 = 0x47 (eine Hex-Ziffer sind vier bit)


0x4711 & 0xFF = 0x11
  0x4711 = 0100 0111 0001 0001
  0x00FF = 0000 0000 1111 1111
           ------------------- AND
           0000 0000 0001 0001 = 0x0011


0x11 << 8 = 0x1100 (logisch, ne?)


nun die Oder-Verknüpfung
0x47 = 0100 0111
0x11 = 0001 0001
       --------- OR
       0101 0111 = 0x57


nun die obligatorische frage: alles klar? :)
Earth - Däääh

RANG Master of Clanintern

#3 - 15.01 20:39

Erstmal danke, aber mich überrasht es immer wieder wie praxisorientiert doch der Stoff an der FH ist.

Ich glaub du hast bei 5. einen Fehler gemacht. Oder ich habe einen Denkfehler gemacht

(0x4711 & 0xFF) << 8)

0100 0111 0001 0001 = 0x4711
0000 0000 1111 1111 = 0xFF
___________________AND
0000 0000 0001 0001

Dann noch um 8 nach links vergeschieben:

0001 0001 0000 0000
0000 0000 0100 0111 = 0x47 (linke Seite)
___________________OR
0001 0001 0100 0111 =

0x1147
pennywise

RANG Deckschrubber

#4 - 16.01 10:03

4711 klingt nach Ditzinger :ugly:
Blumenkind *wake up the dying, don´t wake up the dead*

RANG Skill Admiral

#5 - 16.01 15:13

(-1) >> 3 gibt mir -1 zurück

~n ist das bitweise komplement von n

damit ist
0x37fe5027 & (~1) = 0x37fe5026 = 939413542
Earth - Däääh

RANG Master of Clanintern

#6 - 16.01 18:08

quote:
(-1) >> 3 gibt mir -1 zurück

Ich verstehe das eh noch nicht so ganz. -1 in binär dargestellt wär doch 0000 0001 dann weil es ja negativ ist muss man es im zweierkomplement darstellen. also alle 1 durch nullen erstetzen und alle 0en durch 1en ersetzen.

===> 1111 1110 Dann 1 draufaddiern und man erhält: 1111 1111

Soweit ist mir das auch klar, aber woher weiß ich wie viele Ziffern ich da mit einrechnen muss? Datentyp ist 32 bit.
Blumenkind *wake up the dying, don´t wake up the dead*

RANG Skill Admiral

#7 - 17.01 09:49

also -1 sind nur einsen, wenns 32 bit sind sinds wie viele? genau, 32:

-1 = 11111111111111111111111111111111

wenn man da jetzt shiftet (egal wie viele bits und egal in welche richtung) kommt was raus? genau, das selbe wie vorher, man hat ja nur einsen

de.wikipedia.org/wiki/Integer_(Datentyp)#Beispiele
Earth - Däääh

RANG Master of Clanintern

#8 - 17.01 19:53

Wann wird denn beim shiften mit einsen bzw. nullen aufgefüllt?
Huri-Kane

RANG Deckschrubber

#9 - 18.01 22:15

beim links shift wird generell mit 0 aufgefüllt (auch wenn x86 jeweils einen befehl "shll" für logisches und "sall" für arithmetisches linksschieben hat, der aber das gleiche macht). für das rechts shiften wird hingegen zwischen logisch und arithmetisch differenziert. beim logischen rechts shift wird mit 0 aufgefüllt. beim arithmetischen hingegen wird das vorzeichenbit kopiert (ist als das am weitesten links stehende bit 1, wird mit 1 aufgefüllt, andernfalls mit 0).

btw: stimmt, da beim 5. beispiel hab ich da beim letzten ODER was vergessen :D

btw2: zweierkomplement heißt NICHT, dass alle einsen mit 0 und alle nullen mit 1 ersetzt werden! das datenwort wird vielmehr bitweise negiert und anschließend um eins inkrementiert.
Earth - Däääh

RANG Master of Clanintern

#10 - 18.01 23:02

Ich kenn mich mit Fachausdrücken ned so aus. Aber wenn man es bitweiße negiert ersetzt man doch alle 0en durch 1en? Und dann rechne ich auf das rechte bit "1" drauf.
Huri-Kane

RANG Deckschrubber

#11 - 19.01 10:57

negieren heißt, aus 0 mach 1 und aus 1 mach 0. das sagtest du in deinem vor-vorherigen post zwar schon richtig, jedoch fehlte dabei die entscheidende addition um 1.
Earth - Däääh

RANG Hardcore Ruler

#12 - 09.02 00:08

Danke nochmal an alle die mir hier geholfen haben. In der Prüfung kamm ein Operator vor von dem ich bisher nichts gehört habe es ist der hier ==> ^

Nur mal aus interesse, was macht der?
Dr. Udo Brömme

RANG Master of Clanintern

#13 - 09.02 08:16

XOR.
Earth - Däääh

RANG Ober0wn3r

#14 - 15.02 00:54

War zwar asslig sowas dranzunehmen aber ich habs ja bestanden. Also passts ja. Danke für eure Hilfe. Ohne euch hätte ich vll. nicht die nötigen Punkte gehabt um grad noch zu bestehn.
Huri-Kane

RANG Deckschrubber

#15 - 16.02 12:57

versteh mich nicht falsch: das sind basics, die man in der branche aus dem FF können muss. wenn das nur zum "gerade so bestehen" gereicht hat, solltest du dich diesbezüglich nochmal mit ein paar kommilitonen zusammensetzen .
Earth - Däääh

RANG Ober0wn3r

#16 - 16.02 15:17

Da war eine Aufgabe wo die c-Befehle vorkamen und das machte so. hmm ich schätz mal so gute 5-10% der Prüfung aus. Wenn überhaupt so viel. Das andere hatte überhaupt nichts mit C zu tun.

Aber ja, wenn man programmiert und als solcher arbeitet gehört das schon dazu.
Crush (unterstützt topfree equality)

RANG Deckschrubber

#17 - 28.02 02:47

In der Praxis sollte man solche bitweisen Operationen eigendlich vermeiden bzw. wenn man sie unbedingt braucht hinter Macros und Funktionen verstecken, weil sie zu grauenhaft unleserlichem Code führen. Sprachen die etwas höherleveliger als C sind, nehmen einem sowas in der Regel ab. Aber im Fall der Fälle sollte man schon wissen wo man es nachschlagen kann.