| Ein Standard Kalkulations-Programm zusammen mit einigen 'Benutzer-definierten Basic-Funktionen bietet eine ausgezeichnete Gelegenheit, um BitLevel-Funktionen zu demonstrieren und damit zu experimentieren. | Die Beispiele dieser Seite können dazu evtl. einen Beitrag leisten. Alle Funktionern sind in der Praxis getestet, die Anwendung erfolgt jedoch auf eigenes Risiko. |
BitLevel |
Operationen auf Bit-Ebene |
Bitmuster, Operatoren NOT, AND, OR |
|
LSL, LSR, ASL, ASR, ROL, ROR, SWAP |
|
Negative Zahlen, 2er-Komplement |
|
| Programmierung | Operatoren, Priorität, Speicher-Breite, Anwendung in Programmiersprachen | Auf dieser Seite: |
| Kalkulation | Benutzer-definierte Basic-Funktionen |
| Basic | LibreOffice-Basic, Visual Basic (VBA): Hilfs-Funktionen |
Simulation aller BitLevel-Funktionen mit Strings |
|
Arithmetische Berechnung |
|
| Verwandte Themen | Interne Darstellung: Gleitkomma-Zahlen, Zeichencodes, Umwandlung Strings ↔ (Binär)-Zahlen, Programmiersprache Basic (VBA) |
Kalkulations-Programme |
||||||||||||||||||||||||||||||
Ein Standard Kalkulations-Programm (z.B.
LibreOffice (technisch führend,
kostenfrei), MS-Excel, ...)
ist auf fast jedem PC installiert. Man kann es mit Unterstützung einiger
↓ Basic-Funktionen
gut für einfache BitLevel-Experimente verwenden.Das erfordert keine besonderen Resourcen und bietet in kurzer Zeit anschauliche Ergebnisse. |
In den Beispielen werden die Bitmuster entweder durch ganze Zahlen oder durch
Strings (Texte) aus "0" und "1" Ziffern dargestellt, und zwar
durchwegs mit 8 Bit (1 Byte). Das Kalkulations-Programm wird hier in kleinen Teilen vorgestellt. Das ist aus Platz-Gründen notwendig und zum Aufbau in kleinen Schritten durchaus sinnvoll. |
|||||||||||||||||||||||||||||
Standard-FunktionenDie wenigen von den Kalkulations-Programmen zu diesem Thema angebotenen Funktionen arbeiten - wenn überhaupt vorhanden - unbefriedigend. Darüber hinaus sind ihre Details auch von den verschiedenen Programmen und Versionen abhängig.Funktion Dec2Bin() erzeugt aus einer ganzen Zahl einen Binär-String mit der dazu benötigten Länge. Man kann die Anzahl der Binär-Ziffern wählen, jedoch nur zwischen dem benötigten Minimum und 10. |
Funktion DEZINBIN() erzeugt aus einer ganzen Zahl einen Binär-String mit der dazu benötigten Länge. Man kann die Anzahl der Binär-Ziffern wählen, jedoch nur >= dem benötigten Minimum. Die Funktionen Bin2dec() und BININDEZ() erzeugen aus einem Binär-String eine ganze Zahl, allerdings nur aus maximal 10 Ziffern, und mit BININDEZ() ungefragt nach dem → 2er-Komplement. • Die hier vorgestellten Funktionen bieten mehr Flexibilität und alle Standard Bool-Funktionen zur bitweisen Verknüpfung. |
|||||||||||||||||||||||||||||
Es gibt 2 grundsätzlich verschiedene Ansätze für
BitLevel-Darstellung und -Rechnung:Binär-StringsAlle Funktionen dieser Variante arbeiten mit Binär-Strings, d.h. mit Text, der nur aus den Ziffern "0" und "1" besteht. Damit kann man alle BitLevel-Funktionen gut demonstrieren, jedoch nicht rechnen: Man kann jeden Binär-String jedoch wieder in eine ganze Zahl umwandeln, z.B. mit der hier vorgestellten Basic-Funktion bin_to_int()■ Die Namen aller mit Binär-Strings arbeitenden Funktionen dieser Seite beginnen mit 'bin_' |
Arithmetische RechnungDie BitLevel-Funktionen werden durch arithmetische Berechnung ersetzt. Damit kann man bei Bedarf besser rechnen, das Ergebnis ist jedoch immer eine ganze Zahl. Man kann sie zur Anzeige in einen Binär-String umwandeln.■ Die Namen aller derartigen Funktionen beginnen mit 'bool_' ● In den Kalkulations-Beispielen wird jede Funktion in beiden Variantenn vorgestellt: • Bool-Funktionen verwenden zur Ein- und Ausgabe ganze Zahlen. Die Ergebnisse werden in Binär-Strings umgewandelt. • Binär-Funktionen verwenden zur Ein- und Ausgabe Binär-Strings. Die Ergebnisse werden in ganze Zahlen umgewandelt. |
|||||||||||||||||||||||||||||
Zahlen und Bit-MusterFür alle folgenden Experimente werden in den Zellen B1:C2 die Vorgaben erzeugt. Sie können den Zufalls-Generator B1:B2 natürlich durch beliebige andere ganze Zahlen ersetzen.Die Funktion bin8_from_int() und alle weiteren 'Benutzer-definierten' Funktionen werden im Kapitel ↓ Basic vorgestellt. |
Dieses Kalkulations-Programm erzeugt 2 zufällige 8-Bit Muster:
• Die Binär-Strings in C1:C2 dienen als Vorgabe für alle mit Strings arbeitenden bin-Funktionen. |
|||||||||||||||||||||||||||||
NOT-FunktionDiese Bool-Funktion invertiert alle Bits. Sie braucht nur 1 Argument und wird hier mit der Variablen a demonstriert.• Die arithmetische Funktion bool8_not() verwendet als Argument die Variable a als ganze Zahl, die String-Funktion bin8_not() verwendet die gleiche Variable als Binär-String. |
Bit-Umkehrung mit NOT-Funktion:
Oben (in Zeile 4) die Vorgabe (Argument), unten (in Zeile 6) das Ergebnis.
|
|||||||||||||||||||||||||||||
AND-FunktionDiese Bool-Funktion braucht (mindestens) 2 Argumente (hier a, b). Ein Ergebnis-Bit ist nur dann =1, wenn alle (beide) entsprechenden Eingangs-Bits =1 sind.Oben (in den Zeilen 8,9) die beiden Argumente, unten (in Zeile 11) das Ergebnis. |
AND-Funktion: Anwendung u.a. zum gezielten Löschen von Bits
|
|||||||||||||||||||||||||||||
OR-FunktionDiese Bool-Funktion braucht (mindestens) 2 Argumente (hier a, b). Ein Ergebnis-Bit ist immer dann =1, wenn mindestens eines der (beiden) entsprechenden Eingangs-Bits =1 ist. |
OR-Funktion:
Anwendung u.a. zum gezielten Setzen von Bits
|
|||||||||||||||||||||||||||||
XOR-FunktionDiese Bool-Funktion braucht (mindestens) 2 Argumente (hier a, b). Ein Ergebnis-Bit ist immer dann =1, wenn die beiden entsprechenden Eingangs-Bits ungleich sind. |
XOR-Funktion: Anwendung u.a. zum Vergleich von Bitmustern
|
|||||||||||||||||||||||||||||
NAND-FunktionDiese Bool-Funktion braucht (mindestens) 2 Argumente (hier a, b). Ein Ergebnis-Bit ist nur dann =0, wenn alle (beide) entsprechenden Eingangs-Bits =1 sind. Die Funktion hat in der Elektronik wesentlich mehr Bedeutung als in der Informatik. |
NAND-Funktion:
|
|||||||||||||||||||||||||||||
NOR-FunktionDiese Bool-Funktion braucht (mindestens) 2 Argumente (hier a, b). Ein Ergebnis-Bit ist immer dann =0, wenn mindestens eines der (beiden) entsprechenden Eingangs-Bits =1 ist. Die Funktion hat in der Elektronik wesentlich mehr Bedeutung als in der Informatik. |
NOR-Funktion:
|
|||||||||||||||||||||||||||||
NXOR-FunktionDiese Bool-Funktion braucht (mindestens) 2 Argumente (hier a, b). Ein Ergebnis-Bit ist immer dann =1, wenn die beiden entsprechenden Eingangs-Bits gleich sind. |
NXOR-Funktion: Anwendung u.a. zum Vergleich von Bitmustern
|
|||||||||||||||||||||||||||||
SHIFT-FunktionenIn Spalte A ist ein Zähler 0...8 programmiert. Damit wird das Bitmuster der Variablen a um 0...8 Bits verschoben.Sie können die Zellen A20:C20 nach unten ausfüllen. |
Logische = arithmetische Shift-Left Funktion:
|
|||||||||||||||||||||||||||||
|
Nach dem gleichen Muster kann man auch alle anderen Shift-Funktionen demonstrieren,
z.B. so wie rechts angedeutet: Füllen sie für LSR die Zellen F19:G19
nach unten aus. Erzeugen sie in A30:A38 eine neuen Zähler und füllen sie F30:G30 nach unten aus. Im Bereich C29:D38 ist noch Platz für die Funktion ASL frei, die jedoch genau gleich arbeitet wie LSL. |
Logischer Shift nach rechts (LSR):
Arithmetischer Shift nach rechts (ASR):
|
|||||||||||||||||||||||||||||
ROTATE-FunktionenIn Spalte A ist ein Zähler 0...7 programmiert. Damit wird das Bitmuster aus Zelle C1 um 0...8 Bits verschoben. Jedes 'heraus'-rotierte Bit wird am anderen Ende wieder 'herein' rotiert.Sie können die Zellen D20:E20 nach unten ausfüllen. |
Rotation nach links (ROL):
|
|||||||||||||||||||||||||||||
| Nach dem gleichen Muster kann man auch die ROR-Funktion demonstrieren, z.B. so wie rechts angedeutet: Füllen sie die Zellen F19:G19 nach unten aus. |
Rotation nach rechts (ROR):
|
|||||||||||||||||||||||||||||
Basic (LibreOffice-Basic, Visual Basic, VBA): Binär-Strings |
|
|
Basic bietet in der Grund-Version keine BitLevel Operatoren. Hier werden in 2 Kapiteln einige Funktionen vorgestellt, die Experimente mit BitLevel Operationen erlauben:
►
Darstellung mit Variablen des Typs String (Dieses Kapitel)
► Arithmetische Berechnung mit ganzen Zahlen (nächstes ↓ Kapitel) |
Binär-Strings eignen sich gut zur Demonstration mit
↑ Kalkulations-Programmen. Man kann die vorgestellten Basic-Funktionen mit jedem Standard Kalkulations-Programm (LibreOffice-Calc, MS-Excel, ...) verwenden. |
Umwandlung Zahl -> StringDiese Funktion dient zur Umwandlung einer ganzen Zahl 0..255 in einen Binär-String (Text aus 8 Ziffern "0" und "1"). Nur diese beiden Umwandlungs-Funktionen verwenden Zahlen als Argumente. Alle anderen bin-Funktionen verwenden nur Strings als Argumente.
Function bin8_from_int(int_0_255 As Integer) As String
Dim i, idiv, irest, j As Integer Dim bin As String
irest = Abs(int_0_255)
End Function
While (irest >= 256) irest = irest - 256
Wend
bin = ""For i = 7 To 0 Step -1
idiv = 2 ^ i
Nextj = irest \ idiv bin = bin & CStr(j) irest = irest - j * idiv bin8_from_int = bin Die numerischen Eingabe-Daten int_0_255 werden auf 8 Bit abgeschnitten. Danach werden die Binär-Ziffern in einer For-Schleife einzeln berechnet: Der Stellenwert des jeweiligen Bits wird in der Variablen idiv berechnet. Jede Ziffer wird durch ganzzahlige Division (Operator \ ) in der Variablen j berechnet und in der String-Variablen bin gesammelt. Danach wird der verbleibende Rest neu berechnet. • Die Namen dieser und aller folgenden 8-Bit Funktion des Kapitels beginnen mit bin8 Sie sind daher auch in einer langen Funktionen-Liste leicht zu finden. |
Diese Variante der Funktion erzeugt aus einer ganzen Zahl <= (2^30)-1
einen Binär-String beliebiger Länge:
Function bin_from_int(intg As Long, _
Diese Funktion erzeugt mit 1 Argument einen Binär-String der
benötigten Länge, maximal 30 Bit.Optional bits As Integer = 0) As String
Dim i, imax As IntegerDim idiv, irest, j As Long Dim bin As String
If IsMissing(bits) Then bits = 0
End Function
irest = Abs(intg) imax = bin_digits(irest) If (bits <= 0) Then bits = imax If (imax > 30) Then imax = 30 If (irest > 0) Then
bin = ""
ElseFor i = imax To 0 Step -1
idiv = 2 ^ i
Next
j = irest \ idiv bin = bin & CStr(j) irest = irest - j * idiv bin = "0"
End IfSelect Case (Len(bin)) Case Is < bits bin = String(bits - Len(bin), "0") & bin
Case Is > bitsbin = Right(bin, bits)
End Selectbin_from_int = bin Mit dem optionalen 2. Argument kann man die Bit-Anzahl wählen: Zusätzliche 0-Bits werden links ergänzt, überzählige abgeschnitten. |
Anzahl der Binär-StellenDie Funktion bin_digits() berechnet, wieviele Bits (=Binär-Ziffern) zur binären Darstellung einer ganzen Zahl erforderlich sind.Sie wird u.a. von der Basic-Funktion bin_from_int() verwendet und muss daher ihr Argument ByVal erhalten. |
Berechnung der Binär-Stellen mit
Basic:
Function bin_digits(ByVal intg As Long) As Integer
Dim i As Integer Dim x As Double
x = Abs(CDbl(intg))
End Function
If (x > 0) Then
x = Log(x) / Log(2)
Else
i = Int(x) + 1 i = 1
End Ifbin_digits = i |
Umwandlung String -> ZahlDiese Funktion berechnet aus einem Binär-String mit <=31 Ziffern eine positive ganze Zahl:Diese beiden Funktionen markieren Anfang und Ende von typischen Bitlevel-Operationen: Mit int_to_bin8() kann man ganze Zahlen 0..255 in Bitmuster-Strings umwandeln, danach mit den Bool-Funktionen dieses Kapitels modifizieren, und zuletzt den Binär-String mit Funktion bin_to_int() wieder in eine ganze Zahl umwandeln. |
Berechnung einer Zahl aus einem Binär-String mit
Basic:
Function bin_to_int(bin As String) As Long
Dim i As Integer Dim intg As Long Dim rest As String
rest = bin
End Function
intg = 0 i = 0 While (Len(rest) > 0)
intg = intg + CInt(Right(rest, 1)) * (2 ^ i)
Wendrest = Left(rest, Len(rest) - 1) i = i + 1 bin_to_int = intg |
NOT-Funktion (8 Bit)
Function bin8_not(bin8 As String) As String
Die For-Schleife isoliert je 1 Bit des
erhaltenen String-Arguments bin8 in der
Variablen c Dim i As Integer Dim bin, c As String
bin = ""
End Function
For i = 1 To 8
c = Mid(bin8, i, 1)
Next
If (c = "1") Then
bin = bin & "0"
Else
bin = bin & "1"
End If
bin8_not = bin Im Algorithmus (rot) wird das Bit verarbeitet. Das Ergebnis wird Zeichen-weise im Ausgangs-String bin gesammelt und zuletzt zurückgegeben. |
AND-Funktion (8 Bit)
Function bin8_and(a_bin8 As String, _
Die For-Schleife isoliert je je 1 Bit der beiden
String-Argumente a_bin8, b_bin8 in den
Variablen ca, cb b_bin8 As String) As String
Dim i As IntegerDim bin, ca, cb As String
bin = ""
End Function
For i = 1 To 8
ca = Mid(a_bin8, i, 1)
Nextcb = Mid(b_bin8, i, 1)
If (ca = "1" And cb = "1") Then
bin = bin & "1"
Else
bin = bin & "0"
End If
bin8_and = bin Danach werden die beiden Bits mit dem AND-Algorithmus verknüpft und an den Ergevbnis-String bin angefügt. Alle weiteren bin-Funktionen sind gleich aufgebaut: Es wird lediglich der Algorithmus (rot) zur Verknüpfung der beiden Bits ca, cb ausgetauscht. |
OR-Funktion (8 Bit)
Function bin8_or(a_bin8 As String, _
Diese Funktion ist gleich aufgebaut wie bin_8_and() b_bin8 As String) As String
Dim i As IntegerDim bin, ca, cb As String
bin = ""
End Function
For i = 1 To 8
ca = Mid(a_bin8, i, 1)
Nextcb = Mid(b_bin8, i, 1)
If (ca = "1" Or cb = "1") Then
bin = bin & "1"
Else
bin = bin & "0"
End If
bin8_or = bin Lediglich der Algorithmus (rot) arbeitet anders, d.h. nach der OR-Verknüpfung. |
XOR-Funktion (8 Bit)
Function bin8_xor(a_bin8 As String, _
Diese Funktion ist gleich aufgebaut wie bin_8_and() b_bin8 As String) As String
Dim i As IntegerDim bin, ca, cb As String
bin = ""
End Function
For i = 1 To 8
ca = Mid(a_bin8, i, 1)
Nextcb = Mid(b_bin8, i, 1)
If ((ca = cb) Then
bin = bin & "0"
Else
bin = bin & "1"
End If
bin8_xor = bin Lediglich der Algorithmus (rot) arbeitet anders, d.h. nach der XOR-Verknüpfung. |
NAND-Funktion (8 Bit)
Function bin8_nand(a_bin8 As String, _
Die Funktion verwendet die beiden oben vorgestellten Funktionen
zur AND- und zur NOT-Verknüpfung.
b_bin8 As String) As String
Dim bin As String
bin = bin8_and(a_bin8, b_bin8)
End Function
bin = bin8_not(bin) bin8_nand = bin |
NOR-Funktion (8 Bit)
Function bin8_nor(a_bin8 As String, _
Die Funktion verwendet die beiden oben vorgestellten Funktionen zur OR-
und zur NOT-Verknüpfung.b_bin8 As String) As String
Dim bin As String
bin = bin8_or(a_bin8, b_bin8)
End Function
bin = bin8_not(bin) bin8_nor = bin Analog kann man aus XOR- und NOT- eine NXOR-Funktion zusammenstellen. |
Logischer Shift (8 Bit)Die beiden vorgestellten Funktionen verschieben das Bitmuster des 1. Arguments nach links bzw. nach rechts.• Das optionale 2. Argument bezeichnet die Anzahl der Shifts, d.h. der Bit-Positiionen. Ohne weitere Angaben wird um je 1 Bit verschoben. Die Syntax für optionale Argumente berücksichtigt sowohl LibreOffice-Basic (Funktion IsMissing() ) als auch MS-Basic (VBA). • Ein Shift um 0 Stellen liefert den unveränderten Binär-String. • Shifts um >8 Stellen sind sinnlos, weil das Ergebnis in diesem Fall ausschließlich aus 0-Ziffern besteht. Die Algorithmen für 'Arithmetischen Shift' (nächster ↓ Absatz) sind nahe verwandt. |
Logische Shift-Funktionen mit
Basic:
Function bin8_lsl(bin8 As String, _
Optional bits As Integer = 1) As String
Dim i As IntegerDim bin As String
If IsMissing(bits) Then bits = 1
End FunctionIf bits < 0 Then bits = 0 If bits > 8 Then bits = 8 bin = bin8 For i = 1 To bits
bin = Right(bin & "0", 8)
bin8_lsl = bin Function bin8_lsr(bin8 As String, _ Optional bits As Integer = 1) As String
Dim i As IntegerDim bin As String
If IsMissing(bits) Then bits = 1
End Function
If bits < 0 Then bits = 0 If bits > 8 Then bits = 8 bin = bin8 For i = 1 To bits
bin = Left("0" & bin, 8)
bin8_lsr = bin |
Arithmetischer Shift (8 Bit)● Der Arithmetische Shift nach links (ASL) ist identisch mit dem logischen Shift nach links (voriger ↑ Absatz).● Der arithmetische Shift nach rechts (ASR) behandelt das höchstwertige Bit anders als der logische Shift: In diesem Fall wird nur in der For-Schleife nicht ein "0"-Bit angefügt sondern das höchstwertige Bit verdoppelt. Das hat eine Bedeutung für negative ganze Zahlen: ♦ Details zum Thema 2er-Komplement. |
Arithmetische Shift-Funktionen mit
Basic:
Function bin8_asl(bin8 As String, _
Optional bits As Integer = 1) As String
End FunctionIf IsMissing(bits) Then bits = 1 bin8_asl = bin8_lsl(bin8, bits) Function bin8_asr(bin8 As String, _> Optional bits As Integer = 1) As String
Dim i As IntegerDim bin As String
If IsMissing(bits) Then bits = 1
End Function
If bits < 0 Then bits = 0 If bits > 8 Then bits = 8 bin = bin8 For i = 1 To bits
bin = Left(Left(bin, 1) & bin, 8)
bin8_asr = bin |
Rotation (8 Bit)Die beiden vorgestellten Funktionen rotieren das Bitmuster des 1. Arguments nach links (ROL) bzw. nach rechts (ROR).
Function bin8_rol(bin8 As String, _
Jedes 'heraus' rotierte Bit wird am anderen Ende des Strings wieder angefügt.
Optional bits As Integer = 1) As String
Dim i As IntegerDim bin As String
If IsMissing(bits) Then bits = 1
End Function
If bits < 0 Then bits = 0 bits = bots Mod 8 bin = bin8 For i = 1 To bits
bin = Right(bin & Left(bin, 1), 8)
bin8_rol = bin |
Das optionale 2. Argument bezeichnet die Anzahl der Positionen (Standard =1).
Function bin8_ror(bin8 As String, _
Nach Rotation um 8 Positionen ist der Binär-String wieder identisch.
Optional bits As Integer = 1) As String
Dim i As IntegerDim bin As String
If IsMissing(bits) Then bits = 1
End Function
If bits < 0 Then bits = 0 bits = bits Mod 8 bin = bin8 For i = 1 To bits
bin = Left(Right(bin, 1) & bin, 8)
bin8_ror = bin |
Swap (8 Bit)Diese Funktion vertauscht die beiden Nibbles des 8-Bit Arguments:
Function bin8_swap(bin8 As String) As String
bin8_swap = Right(bin8, 4) & Left(bin8, 4)
End Function
|
♦ Details zur Verwendung von Basic-Modulen |
Basic (LibreOffice-Basic, Visual Basic, VBA): Binär-Arithmetik |
|
|
Die hier vorgestellten Funktionen eignen sich zum Rechnen
mit BitLevel Funktionen. • Die Argumente und Ergebnisse sind jeweils positive ganze Zahlen im Bereich 0...255 • Die Namen aller Funktionen dieses Kapitels beginnen mit dem Prefix bool8 |
Man kann die vorgestellten Basic-Funktionen mit jedem Standard Kalkulations-Programm
(LibreOffice-Calc,
MS-Excel, ...)
verwenden. • Zur Anzeige der Bitmuster dienen z.B. die Funktionen bin_from-int(), bin8_from_int() des ↑ vorigen Kapitels. ♣ Alternative: Die ↑ String-Funktionen führen die gleichen Arbeiten mit Binär-Strings aus. |
Arithmetische GrundlageWenn keine BitLevel-Operatoren zur Verfügung stehen, dann kann man z.B. diese arithmetischen Funktionen verwenden, um Zahlenwerte zu isolieren, die bestimmten Bits entsprechen. |
Verschiebung um 1 Bit nach rechts mit 'ganzzahliger Division'
(mit \ Backslash-Operator !).
i = i \ 2
Verschiebung um 1 Bit nach Links:
i = i * 2
|
NOT-Funktion (8 Bit)
Function bool8_not(int_0_255 As Integer) As Long
Die For-Schleife durchläuft alle 8 Bit-Positionen
einer ganzen Zahl des Bereichs 0..255 Dim i As Integer Dim idiv, ir, irest, j As Long
irest = int_0_255
End Function
ir = 0 For i = 7 To 0 Step -1
idiv = 2 ^ i
Nextj = irest \ idiv If j = 0 Then ir = ir + idiv
irest = irest - j * idiv
bool8_not = ir In der Variablen idiv wird der Stellenwert jedes Bits berechnet. Der (verbliebene) Zahlenwert irest wird durch den Stellenwert ganzzahlig dividiert. In der Variablen ir wird - je nach dem Ergebnis der Division - das Ergebnis aufgebaut. |
AND-Funktion (8 Bit)
Function bool8_and(a_0_255 As Integer, _
Die ganzzahlige Division durch den Stellenwert idiv
wird auf die Reste beider Eingangs-Daten ja, jb
angewendet. Das Ergebnis wird je nach Algorithmus (rot) in der
Variablen ir aufgebaut.b_0_255 As Integer) As Long
Dim i As IntegerDim arest, brest, idiv, ir, ja, jb As Long
arest = a_0_255
End Function
brest = b_0_255 ir = 0 For i = 7 To 0 Step -1
idiv = 2 ^ i
Nextja = arest \ idiv jb = brest \ idiv If (ja = 1 And jb = 1) Then ir = ir + idiv
arest = arest - ja * idivbrest = brest - jb * idiv bool8_and = ir Alle weiteren bool-Funktionen sind gleich aufgebaut: Es wird lediglich der Algorithmus (rot) zur Verknüpfung ausgetauscht: Wenn man die Algorithmus-Zeile gegen diese austauscht, dann erhält man die NAND-Funktion:
If (ja = 0 Or jb = 0) Then ir = ir + idiv
|
OR-Funktion (8 Bit)
Function bool8_or(a_0_255 As Integer, _
Wenn man die Algorithmus-Zeile gegen diese austauscht, dann erhält
man die NOR-Funktion:
b_0_255 As Integer) As Long
Dim i As IntegerDim arest, brest, idiv, ir, ja, jb As Long
arest = a_0_255
End Function
brest = b_0_255 ir = 0 For i = 7 To 0 Step -1
idiv = 2 ^ i
Nextja = arest \ idiv jb = brest \ idiv If (ja = 1 Or jb = 1) Then ir = ir + idiv
arest = arest - ja * idivbrest = brest - jb * idiv bool8_or = ir
If (ja = 0 And jb = 0) Then ir = ir + idiv
|
XOR-Funktion (8 Bit)
Function bool8_xor(a_0_255 As Integer, _
Wenn man die Algorithmus-Zeile gegen diese austauscht, dann erhält
man die NXOR-Funktion:
b_0_255 As Integer) As Long
Dim i As IntegerDim arest, brest, idiv, ir, ja, jb As Long
arest = a_0_255
End Function
brest = b_0_255 ir = 0 For i = 7 To 0 Step -1
idiv = 2 ^ i
Nextja = arest \ idiv jb = brest \ idiv If (ja <> jb) Then ir = ir + idiv
arest = arest - ja * idivbrest = brest - jb * idiv bool8_xor = ir
If (ja = jb) Then ir = ir + idiv
|
Logischer Shift nach links (LSL, 8 Bit)
Function bool8_lsl(a_0_255 As Integer, _
Verschiebung nach links bedeutet Multiplikation mit 2.Optional bits As Integer = 1) As Long
Dim i As IntegerDim ir As Long
If IsMissing(bits) Then bits = 1
End Function
If bits < 0 Then bits = 0 If bits > 8 Then bits = 8 ir = a_0_255 For i = 1 To bits ir = ir * 2
While (ir >= 256)
ir = ir - 256
Wend
bool8_lsl = ir Wenn dabei ein 9. Bit erzeugt wurde, dann wird es durch Subtraktion von 256 entfernt. Die Funktion ist identisch mit dem arithmetischen Shift nach links ASL. |
Logischer Shift nach rechts (LSR, 8 Bit)
Function bool8_lsr(a_0_255 As Integer, _
Diese Verschiebung entspricht in jedem Fall einer ganzzahligen Division
durch 2. Das links ergänzte Bit ist immer =0
Optional bits As Integer = 1) As Long
Dim i As IntegerDim ir As Long
If IsMissing(bits) Then bits = 1
End Function
If bits < 0 Then bits = 0 If bits > 8 Then bits = 8 ir = a_0_255 For i = 1 To bits ir = ir \ 2 bool8_lsr = ir |
Arithmetischer Shift (8 Bit)Das rechts vorgestellte Beispiel zeigt einen arithmetischen Shift:Der arithmetische Shift nach links ASL ist identisch mit dem logischen Shift LSL. Den arithmetische Shift nach rechts (ASR) kann man so berechnen: Das bei jedem Schritt links angefügte (Vorzeichen)-Bit wird schon vor Beginn der Schleife in der Variablen msb isoliert. Im Algorithmus (rot) wird mittels ganzzahliger Division durch 2 nach rechts verschoben und das höchstwertige Bit durch Addition von msb hinzugefügt. |
Function bool8_asl(a_0_255 As Integer, _
Optional bits As Integer = 1) As Long
End FunctionIf IsMissing(bits) Then bits = 1 bool8_asl = bool8_lsl(a_0_255, bits) Function bool8_asr(a_0_255 As Integer, _ Optional bits As Integer = 1) As Long
Dim i As IntegerDim ir, msb As Long
If IsMissing(bits) Then bits = 1
End Function
If bits < 0 Then bits = 0 If bits > 8 Then bits = 8 ir = a_0_255 If (ir >= 127) Then msb = 128
Elsemsb = 0
End IfFor i = 1 To bits ir = (ir \ 2) + msb bool8_asr = ir |
Rotation nach links (ROL 8 Bit)
Function bool8_rol(a_0_255 As Integer, _
Jede Verschiebung oder Rotation nach links entspricht einer Multiplikation mit 2.Optional bits As Integer = 1) As Long
Dim i As IntegerDim ir As Long
If IsMissing(bits) Then bits = 1
End Function
If bits < 0 Then bits = 0 bits = bits Mod 8 ir = a_0_255 For i = 1 To bits
If ir > 127 Then
Nextir = (ir - 128) * 2 + 1 ir = ir * 2 bool8_rol = ir Wenn das links heraus-rotierte Bit gesetzt war, dann wird sein alter Wert (128) subtrahiert und der neue Wert (1) addiert. |
Rotation nach rechts (ROR, 8 Bit)
Function bool8_ror(a_0_255 As Integer, _
Jede verschiebung oder Rotation nach rechts entsprciht einer ganzzahligen Division durch 2.Optional bits As Integer = 1) As Long
Dim i As IntegerDim ir, msb As Long
If IsMissing(bits) Then bits = 1
End Function
If bits < 0 Then bits = 0 bits = bits Mod 8 ir = a_0_255 For i = 1 To bits
If (ir Mod 2 > 0) Then
Nextir = (ir \ 2) + 128 ir = ir \ 2 bool8_ror = ir Wenn das rechts heraus-rotierte Bit gesetzt war, dann wird sein neuer Wert (128) addiert. |
| Alle Funktionen dieses Kapitels arbeiten mit 8-Bit-Worten. Sie verwenden als Argumente a_0_255, b_0_255 positive ganze Zahlen aus dem Bereich 0...255 und liefern ebensolche Ergebnisse. | • Mit etwas Geschick kann man die Funktionen für größere Wort-Breite adaptieren. Dazu wurden die entsprechenden Variablen mit dem Typ Long angelegt. Von einer allgemeinen Formulierung wurde abgesehen, weil die Funktionen dann weniger übersichtlich sind, und weil das über die hier beabsichtigte BitLevel Demonstration hinaus geht. |
Swap (8 Bit)Diese Funktion vertauscht die beiden Nibbles des 8-Bit Arguments:
Function bool8_swap(a_0_255 As Integer) As Integer
bool8_swap = (a_0_255 Mod 16) * 16 + a_0_255 \ 16
End Function
|
♦ Details zur Verwendung von Basic-Modulen |