Bits lesen/setzen
-
Hacker schrieb:
Hmm volkard...
ich glaub sogar, es soll verändert werden - nicht nur weil die Funktion 'set' im Namen trägtIch erkenne es sogar bevor ich den Namen der Funktion überhaupt lese.
Und einen Zeiger zu übergeben heißt natürlich nicht, daß man 0 übergeben dürfte.
-
AHHH nein zähl von rechts, sowie der Computer und PI..
-
template <typename T> bool getbit(T& var, std::size_t bitnum) { return var & (1 << bitnum); } template <typename T> void setbit(T& var, std::size_t bitnum, bool value) { var = (var & ~(1 << bitnum)) | (value << bitnum); }
Ungetestet.
Edit: Könnte nun eher stimmen.
-
Wollt ich auch mit Templates machen..
@PI Wie kommst du auf diese Setter-Funktion? Kann nur falsch sein.
-
Ist mir auch gerade aufgefallen, ich korrigiere gerade.
-
Ämm guck grad
sa mal, wie heißt du eig. im IRC?Edit: is korrekt, meine art is aber cooler
so jetztemplate <class T> inline void setbit(T& var, std::size_t bitnum, bool value) { var = var ^ 1 << bitNum;; }
Ne, is falsch - korrigier grad
Edit: Ne, bleiben wir bei PI's funktion.
-
Hacker schrieb:
@PI Wie kommst du auf diese Setter-Funktion? Kann nur falsch sein.
Wieso?
EDIT: Ach deswegen.
EDIT2: Hat für mich im ersten Moment auch Sinn gemacht. Ich war wohl zu lange auf der Arbeit.
-
Deins ist auch falsch, da kommt value im Ausdruck nicht vor
P.S.: Ich bin nicht sicher, ob ich will, dass du meinen IRC Nick kennst
-
314159265358979 schrieb:
Ich bin nicht sicher, ob ich will, dass du meinen IRC Nick kennst
Wie ist der denn?
Jetz komm- zier dich nich so. Hacker ist auch ganz brav, versprochen.Edit: @_matze: du hast 'nen Job?
-
Du reagierst ja nicht mal.
-
-
Das Problem besteht leider weiterhin, ich kriege es einfach nicht hin einzelne Bits sauber zu lesen.
-
Dann sag ichs dir zum dritten Mal: Sag uns, wie die einzelnen Bits durchnummeriert werden sollen. Beispiele: 01234567, 12345678, 87654321, 76543210. Übrigens wurden auch schon funktionierende Beispiele gepostet. Wenn du sie nicht verstehst oder nicht ans Laufen bekommst, dann sag das.
-
Die Beispiele die hier gepostet wurden haben nicht richtig funktioniert, was genau war habe ich in einem Post vor diesem geschrieben.
Die bits sind so durchnummeriert: 012345678
-
Spongy schrieb:
Die Beispiele die hier gepostet wurden haben nicht richtig funktioniert, was genau war habe ich in einem Post vor diesem geschrieben.
Die bits sind so durchnummeriert: 012345678
Wenn es Dir möglich ist, ändere das.
Und dann nimm den Code von Wikipedia. http://en.wikipedia.org/wiki/Bit_manipulation
-
Es wäre eigentlich schon wichtig, dass die Bits in dieser Reihenfolge ausgelesen werden können, da ich diese Funktionen wie gesagt in einer kleinen CPU-Emulation benutzen werde.
Die CPU arbeitet auch mit dieser Reihenfolge.
Was aber möglich wäre, irgendwie die Zahlen verändern, also z.B.:
7 -> 1
8 -> 0
6 -> 2
5 -> 3Dann könnte ich vor dem eigentlichen setBit oder getBit Aufruf die Zahl einfach verändern und diese dann auslesen lassen.
-
Spongy schrieb:
Was aber möglich wäre, irgendwie die Zahlen verändern, also z.B.:
7 -> 1
8 -> 0
6 -> 2
5 -> 3rechts = 8 - links
-
Spongy schrieb:
Die CPU arbeitet auch mit dieser Reihenfolge.
Ob wir Dir das glauben wollen? Nee, gell, besser nicht.
Schau mal auf Seite 36 von http://www.google.de/url?sa=t&rct=j&q=gameboy cpu instructions&source=web&cd=1&sqi=2&ved=0CBwQFjAA&url=http%3A%2F%2Fmarc.rawer.de%2FGameboy%2FDocs%2FGBCPUman.pdf&ei=PhKsToyfCoaSswbA0c3eDw&usg=AFQjCNFq8XS_4abuA0d4DDsLMAhiG70LHw&sig2=du35gRLnTzZ61QOcTsQ56A&cad=rja
(Die Google-Links werden auch immer schlechter)LD A,$20 <- bit 5 = $20
-
Spongy schrieb:
Die Beispiele die hier gepostet wurden haben nicht richtig funktioniert, was genau war habe ich in einem Post vor diesem geschrieben.
Die bits sind so durchnummeriert: 012345678
Also haben deine Bytes 9 Bits?
-
LD A,$20 LD ($FF00),A LD A,($FF00) LD A,($FF00) CPL AND $0F
Setzt kein einzelnes Bit.
Wenn $20 (Hex = 20h, Dezimal = 32) in den unteres Teil des AF Registers (A, Akkumulator) geschrieben wird steht darin 00100000.Was da mit Bit 5 = $20 gemeint ist versteh ich nicht so wirklich.
Der LD OpCode weist aber nur einem Register einen bestimmten Wert oder ein anderes Register zu (So ähnlich wie der mov Befehl im x86/x64 Assembler).
Die CPU selber besitzt auch glaube ich nur wenige OpCodes die gezielt ein Bit testen.
Ich brauche die Funktionen öfter wenn ich Flags im Flag-Register (F von AF) setzen muss.Nein, meine Bytes haben keine 9 Bits, ich meinte 12345678