![]() |
not und and Operator
Ich beschäftige mich gerade mit den binären Operatoren und hexadezimalsystemen und wollte euch mal Fragen ob meine Vorstellung davon richtig ist:
ein Byte = 8 Bit wenn ich ein Byte hab das 8 einsen hat also 1 1 1 1 1 1 1 1 (jedes bit auf 1 steht) und jetzt möchte ich die 1 an einer Stelle durch ne 0 ersetzen dann müsste das doch mit and und xor klappen oder? Ich hab mir das so gedacht:
Delphi-Quellcode:
Stelle8 auf 0 setzen: Byte xor $01 oder Byte and $FE
Stelle7 auf 0 setzen: Byte xor $02 oder Byte and $FD Stelle6 auf 0 setzen: Byte xor $04 oder Byte and $FB Stelle5 auf 0 setzen: Byte xor $08 oder Byte and $F7 Stelle4 auf 0 setzen: Byte xor $10 oder Byte and $EF Stelle3 auf 0 setzen: Byte xor $20 oder Byte and $DF Stelle2 auf 0 setzen: Byte xor $40 oder Byte and $BF Stelle1 auf 0 setzen: Byte xor $80 oder Byte and $7F So also die 1. Frage ist das richtig? 2. Wie initialisiere ich ein byte mit 1sen?( so: byte and $FF ?) Danke schonmal |
Re: not und and Operator
erstmal ist das "rechteste" bit das bit 0 und das "linkeste" bit das bit 7 in einem 8-bit-byte.
normale stellenwertnotation. es wird bei 0 angefangen mit zaehlen, weil dann shifts logischer sind. grundsaetzlich sind deine xors richtig, aber sowas macht man eigentlich mit ands und nots, weil du mit einem xor nur das bit umdrehst (1->0, 0->1). du willst es aber resetten, denke ich... initialisieren geht mit direkten werten, also z.b. $FF |
Re: not und and Operator
gibt es auch was anderes außer 8 bit bytes, ich dachte das 8 bits 1 byte sind ist ne definition....
Hmm okay, also and' s benutzen. Mit not säh das so aus?
Delphi-Quellcode:
byte := not $01 für an der [b]7.[/b] Stelle ne null zu setzen? Danke!!!! |
Re: not und and Operator
es gibt/gab architekturen mit !=8 bits per byte. braucht dich aber nur historischerweise zu kuemmern.
variable := not $01; bedeutet, dass variable alle bits bis auf das rechteste (kleinstwertigste) besetzt bekommt. nenne es "bit 0", also "bit null", weil es das nullte bit ist. es wird von rechts nach links numeriert, angefangen bei null. bit setzen: var := var or $01; { setzt bit null } var := var or $04; { setzt bit zwei } bit loeschen: var := var and not $01; {loescht bit null } var := var and not $80; {loescht bit sieben } |
Re: not und and Operator
wer sich sowas ausdenkt....
von rechts nach links, sind wir hier in Japan?? ;) das mit bei null anfangen zu Zählen kann ich ja verkraften aber dann auch noch von rechts.... *kopfschüttel* Zitat:
|
Re: not und and Operator
Zitat:
Entsprechend : 10^0, 10^1, 10^2, ... bzw. im Binaersystem halt 2^0, 2^1, 2^2, 2^3 (jeweils von rechts nach links). Anders herum wuerde es Probleme geben. Ganz einfaches Beispiel in im Dezimalsystem: 23 = 2*10^1 + 3*10^0 230 = 2*10^2 + 3*10^1 + 0*10^0 Von links nach rechts durchnummeriert wuerde diese Zerlegung nicht funktionieren, dann waere 23 = 230 ;-) |
Re: not und and Operator
5634 = (5 * 10**3) + (6 * 10**2) + (3 * 10**1) + (4 * 10**0)
"erste" stelle (stelle null) ist ne 4. dagegen hat keiner was. beschwer dich bei den arabern, von denen wir unser zahlensystem geklaut haben. |
Re: not und and Operator
Dann könnt ihr mir bestimmt auch erklären warum das hier nicht klappt:
Delphi-Quellcode:
function getbitfrombyte(b : byte; pos : integer) : Boolean;
Begin if b shl (7-pos) = $80 then result := true else result := false; end; var b : byte; Begin b := $FF; if getbitfrombyte(b, 0) then showmessage('JO') else showmessage('nö'); end. Warum liefert mir das "nö" ??? $FF = 1 1 1 1 1 1 1 1 Nr.: 7 6 5 4 3 2 1 0 Ich meine wenn ich b um 7 bits nach links verschiebe hab ich doch 1 0 0 0 0 0 0 0 und das ist doch $80 ... könnte natürlich auch an mir leigen das ich einfach die Delphihilfe nicht verstehe aber so wie die das dort beschreiben müsste das 'JO' ergeben Zitat:
|
Re: not und and Operator
Zitat:
Du speicherst das Ergebnis nicht in einer Variable, sondern benutzt es direkt zum Vergleich. $FF shl 7 ist $7F80. Erst wenn man das Ergebnis in einer Byte-Variable speichert werden die oberen Bits abgeschnitten und man erhält $80. Das kann man auch durch einen Typecast erreichen:
Delphi-Quellcode:
Aber auch damit ist deine getbitfrombyte-Funktion falsch. Beispiel: getbitfrombyte($FF, 7) führt zu dem Vergleich "if $FF = $80" --> false, obwohl true herauskommen sollte.
if Byte(b shl (7-pos)) = $80
So ist es richtig:
Delphi-Quellcode:
if b shl (7-pos) and $80 <> 0
|
Re: not und and Operator
hmm mist, stimmt,
okay der fehler wäre durch mein Programm nicht aufgefallen weil nur nach der 0ten stelle gefragt wird, hab ich gar nicht dran gedacht, aber gut dann merk ich mir das aufjedenfall mit der variablen und wie es richig geht! Dankeschön! Edit: hab noch ne kleine Frage...ich frag einfach nochmal hier, gehört zwar nur noch bedinnt dazu: Ich bin dabei ein kleines Verschlüsselungsprogramm zu schreiben, was die Daten in den letzten Bits des Farbcodes versteckt. Ich glaube das nennt man Stenographie. ein Buchstabe (char) hat ja 8 bits. D.h. ich brauche 3 Pixel. 2x r, g, b und 1x r, g. Wenn ich nun immer das 0te Bit des Farbwertes von r, g, b löche mit (r := r and $FE ) und dann wenn der das 0te byte des Buchstaben 1 ist dann setze ich (r := r or $01). D.h. r1 = 0.Bit g1 = 1.Bit b1 = 2.Bit //Pixel wieder schreiben r2 = 3.Bit g2 = 4.Bit b2 = 5.Bit //Pixel wieder schreiben r3 = 6.Bit g3 = 7.Bit b3 = b3 //Pixel wieder schreiben Das müsste doch stimmen oder? Und zurück lesen geht ja einfach andersrum: 0.Bit = r(Pixel1) 1.Bit = g(Pixel1) .... Ist da nen Denkfehler drin? Ich bekomme es nicht entschlüsselt und ich finde den Fehler nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz