Seite 1 von 1

PeekBit() ?

Verfasst: 21.10.2005 21:27
von IcedCoffee
moin

ich will mir einen Zeichensatzt mit 6Bit proggen
aber weiss nicht wie ich Bit's auslessen kan

Verfasst: 21.10.2005 21:50
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:

Verfasst: 22.10.2005 02:22
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

Verfasst: 22.10.2005 09:04
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

Verfasst: 22.10.2005 09:45
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.

Verfasst: 22.10.2005 12:22
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