Binary Shift mit Wrap Around

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

Dreamora

Betreff: Binary Shift mit Wrap Around

BeitragMi, Apr 26, 2006 0:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Standardmässig beherrscht BlitzMax ja nur das einfache verschieben der Bits (shl, shr), sowie für den fall nach rechts noch das verschieben und auffüllen (sar).

Häufig wäre es jedoch notwendig, dass ein Bit, welches man auf der einen Seite rausschiebt, auf der anderen wieder reinkommt.
Also zb: 1100 -> 0110 -> 0011 -> 1001 -> 1100

Deswegen hier ein kleines Beispiel und die 2 dafür notwendigen Funktionen, in welchen ihr selbst angeben könnt, wie lange eure Bitfolge ist. Obige hätte zb eine Bitlength von 4
(sonst ginge das ganze bis rauf auf die Maximallänge des Zahlentyps. Mit den Funktionen unten kann man prinzipiell auf Int bleiben, was am schnellsten ist, da die Libraries auf Int und Float optimiert sind)

Code: [AUSKLAPPEN]
b=%1010
For i=1 To 33
   Print Bin(b)
   b=whr(b,4)
Next
b=%1010
For i=1 To 33
   Print Bin(b)
   b=whl(b,4)
Next


Function WHR:Int(number:Int, bitlength:Int=32)
   If number & 1
      Return ( (number Shr 1) | (%1 Shl (bitlength-1)))
   Else
      Return (number Shr 1)
   EndIf
End Function

Function WHL:Int(number:Int, bitlength:Int=32)
   If number & (1 Shl (bitlength-1))
      Return ( ((number Shl 1) ~ (1 Shl (bitlength)) )| 1 )
   Else
      Return (number Shl 1)
   EndIf
End Function
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group