Bit in Zahl setzen/löschen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Iguan

Betreff: Bit in Zahl setzen/löschen

BeitragFr, März 16, 2012 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich möchte gerne ein einzelnes Bit in einer Zahl setzen oder löschen... irgendwie klappt das löschen in meiner Funktion nicht:

Code: [AUSKLAPPEN]

Function SetBit(Value,Bit, State)
   Mask = 1 Shl Bit
   If State Then
       Value = Value Or Mask
   Else
                  NegMask = Not Mask ;<-- hier wird das Problem liegen
                  Value = Value And NegMask
   EndIf
   Return Value
End Function

Function TestBit(Value,Bit)
   Value = Value And (1 Shl Bit)
   If Value Then Return 1 Else Return 0
End Function



In C kann man ja Bits folgendermassen löschen:

Mask = 1 << ZuLoeschendesBit;
Value & = ~Mask;

und so setzen:

Mask = 1 << ZuSetzendesBit;
Value |= Mask;


nun... wie macht man das in BlitzBasic?




Code: [AUSKLAPPEN]

Mask = 1
Value = NOT Mask

"Value" müsste doch eigentlich eine grosse Zahl ergeben, da alle Binären Nullen zu Einsen werden...oder verstehe ich da was falsch? Rolling Eyes Question

Chester

BeitragSa, März 17, 2012 1:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine binäre Negation ist in BB auch ~

Also:
Code: [AUSKLAPPEN]
NegMask = ~Mask


Alternativ müsstest du es über eine Bank lösen können.

Eingeproggt

BeitragSa, März 17, 2012 9:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man so überlegt hat Chester eigentlich schon alles gesagt was in deinem Fall von Bedeutung ist.
Aus irgendeinem Grund war ich (bevor ich nachgedacht hab) aber schon so aktiv, selbst was zu basteln:

Code: [AUSKLAPPEN]
Local mask=0

DebugLog "Setze 2. Bit"
mask=SetBit(mask,2)
For i=0 To 7
   DebugLog GetBit(mask,i)
Next

DebugLog "Setze 5. Bit"
mask=SetBit(mask,5)
For i=0 To 7
   DebugLog GetBit(mask,i)
Next

DebugLog "Lösche 2. Bit"
mask=UnsetBit(mask,2)
For i=0 To 7
   DebugLog GetBit(mask,i)
Next

DebugLog "Lösche 3. Bit"
mask=UnsetBit(mask,3)
For i=0 To 7
   DebugLog GetBit(mask,i)
Next

WaitKey()
End

Function SetBit(value,bit)
   Return value Or (1 Shl bit)
End Function

Function UnsetBit(value,bit)
   Return value And ~(1 Shl bit)
End Function

Function GetBit(value,Bit)
   Return (value And (1 Shl Bit))>0
End Function


Tja... es is aber nix Neues, sondern bestätigt im Prinzip nur deine Herangehensweise Wink
mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Iguan

BeitragSa, März 17, 2012 10:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank! Genau das brauchte ich Laughing ! Das mit dem "~" wusste ich nicht... habe in der Hilfe unter Mathematik nachgeschaut. Wo findet man alle binären operatoren?

FireballFlame

BeitragSa, März 17, 2012 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Alle anderen, dort, wo du geschaut hast. Den, den du verpasst hast, hier.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

aMul

Sieger des Minimalist Compo 01/13

BeitragDi, März 27, 2012 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Da wir schon so kleinlich sind und von Bits reden möchte ich anmerken, dass Eingeproggts GetBit() das Vorzeichen-Bit nicht erkennen kann, da:

Code: [AUSKLAPPEN]
1 Shl 31 = −2147483648 <= 0


Entsprechend muss das größer-Zeichen durch ein ungleich ersetzt werden, oder man benutzt die folgende übrigens schnellere Funktion(wie gesagt, kleinlich Wink).

BlitzBasic: [AUSKLAPPEN]
Function GetBit(value, bit) 
Return (value Shr bit) And 1
End Function
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group