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

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:
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