Einzelnen Beitrag anzeigen

Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#13

AW: C++ Operator |= in Delphi

  Alt 22. Feb 2011, 22:50
Bücher auf Deutsch oder darf's auch Englisch sein?

$1 = 1b
$4 = 100b
sind wieder 100 binär richtig?
Okay, was vielen Leuten hilft, ist es sich or als + vorzustellen. Das stimmt unter bestimmten Randbedingungen nicht mehr ganz, aber hier ist es sogar anschaulich. Aber erstmal erklären wir Nibbles.

Ein Nibble sind 4bit, also ein halbes Oktett (Oktette werden üblicherweise als Bytes bezeichnet).

Nun zur Korrelation der Werte:

Code:
binär | hexadezimal | dezimal
------------------------------
0000  |      $0     |     0
0001  |      $1     |     1
0010  |      $2     |     2
0011  |      $3     |     3
0100  |      $4     |     4
0101  |      $5     |     5
0110  |      $6     |     6
0111  |      $7     |     7
1000  |      $8     |     8
1001  |      $9     |     9
1010  |      $A     |    10
1011  |      $B     |    11
1100  |      $C     |    12
1101  |      $D     |    13
1110  |      $E     |    14
1111  |      $F     |    15
Über diese Tabelle kannst du selbst im Kopf einfach von/nach binär umrechnen. Wir wissen nämlich nun, daß eine Hexadezimalstelle vier Binärstellen entspricht. Beispiel:

Code:
$ABCDEF
 ||||||__ 1111
 |||||___ 1110
 ||||____ 1101
 |||_____ 1100
 ||______ 1011
 |_______ 1010
Leserichtung "nach oben", also 10101011.11001101.11101111.

Wieso werden denn da nicht einfach die Werte zugewiesen, das ist ja gar nicht nötig wenn es wieder das gleiche gibt wie wenn man nichts macht
In deinem oben zitierten Fall will man eben folgendes erreichen, hier am Beispiel:

Delphi-Quellcode:
  ctx.Dr3:= $ADDRESSE4;
  ctx.Dr7:= ctx.Dr7 or $00000040;
ctx.Dr7 hat bereits irgendeinen Wert. Es ist für uns unwichtig, aber wir wollen das Bit setzen welches durch $00000040 repräsentiert wird - man nennt das Bitmaske. Wenn wir in unserer Tabelle nachschauen, sehen wir:

Code:
$40 == 01000000
Da man bei Bits von 0 und von "hinten" zu zählen beginnt

Code:
0 1 0 0 0 0 0 0
| | | | | | | |
7 6 5 4 3 2 1 0
  *
wollen wir also Bit 6 setzen ohne die anderen Bits zu beeinflussen. Deswegen hier ein bitweises Oder.

Hier ein paar Beispiele für den Wert in Dr7 davor und danach. Wobei wir hier der Einfachheit halber nur die unteren beiden Nibble (also die unteren 8 Bit) betrachten). Alles binär:

Code:
[Dr7]    or 01000000 == ...
----------------------------
00000000 or 01000000 == 01000000
00000001 or 01000000 == 01000001
00010001 or 01000000 == 01010001
00010010 or 01000000 == 01010010
00100010 or 01000000 == 01100010
00100011 or 01000000 == 01100011
00110011 or 01000000 == 01110011
00110100 or 01000000 == 01110100
01000100 or 01000000 == 01000100
01000101 or 01000000 == 01000101
01010101 or 01000000 == 01010101
01010110 or 01000000 == 01010110
01100110 or 01000000 == 01100110
01100111 or 01000000 == 01100111
01110111 or 01000000 == 01110111
01111000 or 01000000 == 01111000
10001000 or 01000000 == 11001000
10001001 or 01000000 == 11001001
10011001 or 01000000 == 11011001
10011010 or 01000000 == 11011010
10101010 or 01000000 == 11101010
10101011 or 01000000 == 11101011
10111011 or 01000000 == 11111011
10111100 or 01000000 == 11111100
11001100 or 01000000 == 11001100
11001101 or 01000000 == 11001101
11011101 or 01000000 == 11011101
11011110 or 01000000 == 11011110
11101110 or 01000000 == 11101110
11101111 or 01000000 == 11101111
11110000 or 01000000 == 11110000
11111111 or 01000000 == 11111111
Da unsere Bitmaske $40 nur ein gesetztes Bit hat, wird auch nur dieses beeinflußt. Entsprechend ändert sich im Ergebnis nur Bit 6.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)

Geändert von Assarbad (22. Feb 2011 um 23:07 Uhr)
  Mit Zitat antworten Zitat