Bit schreiben / lesen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Bit schreiben / lesen

Beitrag von NicTheQuick »

Ach, guck mal an. Das war anscheinend mal von mir. :mrgreen:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Bit schreiben / lesen

Beitrag 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 ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Re: Bit schreiben / lesen

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Bit schreiben / lesen

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Bit schreiben / lesen

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Bit schreiben / lesen

Beitrag 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:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Bit schreiben / lesen

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Bit schreiben / lesen

Beitrag von NicTheQuick »

Doch, sein Code ist richtig. Aber aus irgendeinem Grund hast du die Tilde (~) nicht kopiert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Bit schreiben / lesen

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Bit schreiben / lesen

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten