PeekBit() ?

Anfängerfragen zum Programmieren mit PureBasic.
IcedCoffee
Beiträge: 115
Registriert: 09.07.2005 12:11
Wohnort: Fürstenwald [Internat], Berlin[wen keine lust auf Internat], Wildau[Einfamilienhaus]
Kontaktdaten:

PeekBit() ?

Beitrag von IcedCoffee »

moin

ich will mir einen Zeichensatzt mit 6Bit proggen
aber weiss nicht wie ich Bit's auslessen kan
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

Beitrag von ts-soft »

Versuchs mal hiermit:

Code: Alles auswählen

Procedure.l SetBit(nValue.l, nBitNumber.l, nBoolean.l)
  nBitNumber = 1 << nBitNumber
  If nBoolean
    ProcedureReturn nValue | nBitNumber
  Else
    ProcedureReturn (nValue | nBitNumber) & ~nBitNumber
  EndIf
EndProcedure
Procedure.l TestBit(nValue.l, nBitNumber.l)
  If nValue & (1 << nBitNumber)
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure
Die 2te Procedure ist Dein PeekBit :wink:
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
IcedCoffee
Beiträge: 115
Registriert: 09.07.2005 12:11
Wohnort: Fürstenwald [Internat], Berlin[wen keine lust auf Internat], Wildau[Einfamilienhaus]
Kontaktdaten:

Beitrag von IcedCoffee »

:? Bahnhoff
kannst du mir den code bitte mal erklären

soweit ich den code interpretiere ist das nicht genz das was ich will
weil wen ich die VarType Byte nehme ist ja 00100010 = 34
und die beiden 00 am anfang kotzen mich an weil ich will nur 100010 im ram haben [2bit weniger] damit ich gleich danach meine nächte zahl schreiben kann
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

Beitrag von ts-soft »

SetBit()

Syntax

Result = SetBit(Value.l, BitNumber.l Flag.l)

Beschreibung

Setzt das Bit im Wert auf den Wert von Flag (1 oder 0).
TestBit()
Syntax

Result = TestBit(Value.l, BitNumber.l)

Beschreibung

Prüft, ob das angegebene Bit im Wert gesetzt ist

Code: Alles auswählen

Procedure.l SetBit(nValue.l, nBitNumber.l, nBoolean.l)
  nBitNumber = 1 << nBitNumber
  If nBoolean
    ProcedureReturn nValue | nBitNumber
  Else
    ProcedureReturn (nValue | nBitNumber) & ~nBitNumber
  EndIf
EndProcedure
Procedure.l TestBit(nValue.l, nBitNumber.l)
  If nValue & (1 << nBitNumber)
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

a = %1111
Debug Bin(a)

a = SetBit(a, 0, 0) ; letztes Bit von a auf 0 Setzen
Debug Bin(a)

If TestBit(a, 0) ; dürfte nicht kommen
  MessageRequester("", "letztes Bit von a gesetzt: a=" + Bin(a))
Else ; diese Meldung sollte kommen
  MessageRequester("", "letztes Bit von a nicht gesetzt: a=" + Bin(a))
EndIf
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
horst
Beiträge: 70
Registriert: 08.09.2004 19:33
Wohnort: München
Kontaktdaten:

Beitrag von horst »

IcedCoffee hat geschrieben:... weil ich will nur 100010 im ram haben [2bit weniger] damit ich gleich danach meine nächte zahl schreiben kann
Also du hast eine Folge von 6-Bit-Einheiten über die Byte-Grenzen hinweg?

Um 6 Bits zu lesen brauchst du eine Maske, also eine Variable, bei der genau die gewünschten Bits an sind.

Du fängst an mit der Maske %111111 in der Variablen Maske.l
Die ersten 6 Bits an der Adresse *Pointer erhältst du dann mit:

Code: Alles auswählen

Zeichen = PeekL(*Pointer) & Maske
Für die nächsten 6 Bits schiebst du die Maske um 6 nach links, und den Wert dann 6 nach rechts:

Code: Alles auswählen

Maske << 6
Zeichen = PeekL(*Pointer) & Maske
Zeichen >> 6
Nach 4 mal hast du 6*4=24 Bits, und dann gehst du mit dem Pointer 3 Bytes (3*8=24 Bits) weiter und fängst wieder von vorne an...

Das Ganze setzt freilich voraus, dass die ersten 6 Bits an einer Adresse (also das erste Zeichen) die niederwertigen Bits in einem Byte sind.
horst
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Wenn Du in einem größeren Speicherbereich (bis 2GB) Bits einzeln ansprechen und lesen/setzen möchtest, schau auch mal hier:

http://forums.purebasic.com/german/arch ... ht=peekbit
!UD2
Antworten