Seite 2 von 3

Re: Bit schreiben / lesen

Verfasst: 16.02.2011 18:04
von NicTheQuick
Ach, guck mal an. Das war anscheinend mal von mir. :mrgreen:

Re: Bit schreiben / lesen

Verfasst: 16.02.2011 18:29
von STARGÅTE
Ich frag mich allerdings warum du (damals?) bei SetBitFalse() erst noch ein Bit setzt und dann wieder löschst ?
Also im Prinzip reich doch:

Code: Alles auswählen

Procedure SetBit(Quad.q, Bit.i, Value.i)
  ProcedureReturn Quad & ~(1<<Bit) | Value<<Bit
EndProcedure

Debug RSet(Bin(SetBit(%0000, 0, 1)),4,"0")
Debug RSet(Bin(SetBit(%0000, 3, 1)),4,"0")
Debug RSet(Bin(SetBit(%1111, 0, 1)),4,"0")
Debug RSet(Bin(SetBit(%1111, 3, 1)),4,"0")
Debug RSet(Bin(SetBit(%0000, 0, 0)),4,"0") 
Debug RSet(Bin(SetBit(%0000, 3, 0)),4,"0")
Debug RSet(Bin(SetBit(%1111, 0, 0)),4,"0") 
Debug RSet(Bin(SetBit(%1111, 3, 0)),4,"0")
Hier noch der Vollständigkeitshalber:

Code: Alles auswählen

Procedure GetBit(Quad.q, Bit.i)
  ProcedureReturn Quad>>Bit & 1
EndProcedure

Debug GetBit(%0000, 3)
Debug GetBit(%1111, 3)
Edit: SetBit geht ja noch einfacher, ohne Abfrage ^^

Re: Bit schreiben / lesen

Verfasst: 16.02.2011 19:15
von Christian H
STARGÅTE hat geschrieben:

Code: Alles auswählen

Procedure SetBit(Quad.q, Bit.i, Value.i)
Sollte man dass nicht als Makro schreiben?!

Code: Alles auswählen

Macro SetBit(var, Bit, Value)
  var & ~(1<<Bit) | Value<<Bit
EndMacro

Define.b
Test = %0000
SetBit(Test, 0, 1) : Debug RSet(Bin(Test),4,"0")
SetBit(Test, 3, 1) : Debug RSet(Bin(Test),4,"0")
SetBit(Test, 1, 1) : Debug RSet(Bin(Test),4,"0")
SetBit(Test, 2, 1) : Debug RSet(Bin(Test),4,"0")
SetBit(Test, 0, 0) : Debug RSet(Bin(Test),4,"0")

Debug "--------------"

Define.q
Test = %0000
SetBit(Test, 0, 1) : Debug RSet(Bin(Test),4,"0")
SetBit(Test, 3, 1) : Debug RSet(Bin(Test),4,"0")
SetBit(Test, 1, 1) : Debug RSet(Bin(Test),4,"0")
SetBit(Test, 2, 1) : Debug RSet(Bin(Test),4,"0")
SetBit(Test, 0, 0) : Debug RSet(Bin(Test),4,"0")
Gruß Christian

Re: Bit schreiben / lesen

Verfasst: 16.02.2011 19:19
von STARGÅTE
Jo, vermutlich günstiger, dann aber bitte alles schön einklammern, damit es nicht zu flaschen Ergebnissen kommt, weil sich die Priorität ändert:

Code: Alles auswählen

Macro SetBit(var, Bit, Value)
  ( (var) & ~(1<<(Bit)) | (Value)<<(Bit) )
EndMacro

Macro GetBit(var, Bit)
  ( (var)>>(Bit) & 1 )
EndMacro

Re: Bit schreiben / lesen

Verfasst: 16.02.2011 19:29
von ts-soft
Wäre auch schön, wenn es richtige Ergebnisse bringen würde :mrgreen:

Code: Alles auswählen

Debug RSet(Bin(SetBit(%1111, 0, 1)),4,"0")
Ergibt bei mir immer noch %1111, weil Bit 0 ist bereits gesetzt, also keine
Änderung!

Oder was macht euer Code, was ich nicht verstehe :freak:

Re: Bit schreiben / lesen

Verfasst: 16.02.2011 19:37
von NicTheQuick
STARGÅTE hat geschrieben:Ich frag mich allerdings warum du (damals?) bei SetBitFalse() erst noch ein Bit setzt und dann wieder löschst ?
Also im Prinzip reich doch:

Code: Alles auswählen

Procedure SetBit(Quad.q, Bit.i, Value.i)
  ProcedureReturn Quad & ~(1<<Bit) | Value<<Bit
EndProcedure

Debug RSet(Bin(SetBit(%0000, 0, 1)),4,"0")
Debug RSet(Bin(SetBit(%0000, 3, 1)),4,"0")
Debug RSet(Bin(SetBit(%1111, 0, 1)),4,"0")
Debug RSet(Bin(SetBit(%1111, 3, 1)),4,"0")
Debug RSet(Bin(SetBit(%0000, 0, 0)),4,"0") 
Debug RSet(Bin(SetBit(%0000, 3, 0)),4,"0")
Debug RSet(Bin(SetBit(%1111, 0, 0)),4,"0") 
Debug RSet(Bin(SetBit(%1111, 3, 0)),4,"0")
Ich weiß auch nicht mehr so genau, was ich mir vor mehr als 7 Jahren dabei gedacht habe. ^^
ts-soft hat geschrieben:Wäre auch schön, wenn es richtige Ergebnisse bringen würde :mrgreen:

Code: Alles auswählen

Debug RSet(Bin(SetBit(%1111, 0, 1)),4,"0")
Ergibt bei mir immer noch %1111, weil Bit 0 ist bereits gesetzt, also keine
Änderung!

Oder was macht euer Code, was ich nicht verstehe :freak:
Das ist schon richtig, dass da %1111 heraus kommt. Du setzt Bit 0 auf 1. Und da es vorher schon 1 war, bleibt es das auch.

///Edit:
Im Übrigen hier mein Vorschlag für die Makros:

Code: Alles auswählen

Macro _BV(bit)
	(1 << bit)
EndMacro

Macro SetBitFalse(var, bit)
	(var  & ~_BV(bit))
EndMacro

Macro SetBitTrue(var, bit)
	(var | _BV(bit))
EndMacro

Macro SetBit(var, bit, value)
	((var | _BV(bit)) ! ((value ! 1) << bit))
EndMacro

Macro GetBit(var, bit)
	((var & _BV(bit)) >> bit) & 1
EndMacro
Ich denke über 'SetBit()' kann man sich streiten. :wink:

Re: Bit schreiben / lesen

Verfasst: 16.02.2011 19:46
von ts-soft
NicTheQuick hat geschrieben:Das ist schon richtig, dass da %1111 heraus kommt. Du setzt Bit 0 auf 1. Und da es vorher schon 1 war, bleibt es das auch.

Code: Alles auswählen

Macro SetBit(var, Bit, Value)
  ( (var) & (1<<(Bit)) | (Value)<<(Bit) )
EndMacro

Macro GetBit(var, Bit)
  ( (var)>>(Bit) & 1 )
EndMacro

Debug RSet(Bin(SetBit(%1111, 0, 1)),4,"0") 
Dann sind also alle von STARGÅTE geposteten Version schlichtweg falsch :mrgreen:
nur so nebenbei angemerkt, nicht das sich das jemand wegspeichert ohne zu prüfen.

Re: Bit schreiben / lesen

Verfasst: 16.02.2011 19:49
von NicTheQuick
Doch, sein Code ist richtig. Aber aus irgendeinem Grund hast du die Tilde (~) nicht kopiert.

Re: Bit schreiben / lesen

Verfasst: 16.02.2011 19:54
von ts-soft
NicTheQuick hat geschrieben:Doch, sein Code ist richtig. Aber aus irgendeinem Grund hast du die Tilde (~) nicht kopiert.
Achso, das alte Tilde Problem mit meinem Greasemonkey Script :lol:
Dann nehme ich alles zurück.

Schon das zweite mal, das ich in die Tilde-Falle laufe.

Re: Bit schreiben / lesen

Verfasst: 16.02.2011 19:55
von STARGÅTE
Achso, das alte Tilde Problem mit meinem Greasemonkey Script
Ja sry, ich kanns mir zur Zeit noch nicht erklären, warum das in FF verschwindet ...
versuche mich aber darum zu kümmern ...