Tags: PowerShell
PowerShell bietet mehrere Operatoren, um binäre Zahlen auf Bit-Ebene zu manipulieren. Dazu gehören neben einem UND- sowie einem ODER-Operator auch solche für ein exklusives ODER sowie für die Negation. Hinzu kommen zwei Shift-Operatoren, welche die Bits um eine bestimmte Anzahl an Stellen nach links oder rechts verschieben.
Grundsätzlich stellt sich die Frage, wieso eine Script-Sprache, die hauptsächlich der Automation in der Systemverwaltung dient, Operatoren auf Bit-Ebene benötigt.
In der Praxis gibt es aber tatsächlich immer wieder derartige Anwendungen, etwa wenn die einzelnen Bits eines Werts als Flags für bestimmte Einstellungen fungieren.
Ein Beispiel dafür sind die Attribute im Active Directory für den Kerberos-Verschlüsselungstyp oder UserAccountControl für wichtige Konto-Einstellungen. Letzteres zeigt beispielweise an, ob ein Account deaktiviert ist, wenn das zweite Bit gesetzt ist (entspricht einem Wert von binär 00000010).
Bitweises UND (-band)
Verknüpft man den Wert des Attributs über ein Bit-weises UND mit 2, dann ist das Ergebnis nur dann wahr, wenn das zweite Bit gesetzt ist, also das Konto deaktiviert wurde.
Angenommen, der Wert von UserAccountControl für ein Konto ist 514, dann weist es der folgende Befehl als deaktiviert aus:
Get-ADUser -Filter * -Properties UserAccountControl |
Where { $_.UserAccountControl -band 0B00000010} | Select name
Das führende "0B" kennzeichnet die Zahl als binär. Das Ergebnis der Operation ist 2 und somit "wahr", weil die zweite Stelle von rechts in beiden Zahlen 1 ist. Verknüpft man sie über ein UND, dann bleibt dort die 1 erhalten.
Gibt man obigen Ausdruck jedoch in Windows PowerShell ein, dann erhält man eine Fehlermeldung. Im Unterschied zu PowerShell 7 kann man dort Binärzahlen so nicht verwenden. Man nutzt stattdessen Dezimal- oder Hexadezimalzahlen, die Operationen erfolgen aber dennoch auf Bit-Ebene.
Bitweises ODER (-bor und -bxor)
Ersetzt man in der obigen Operation das UND durch ein ODER, dann erhält man den Ausgangswert 514, weil das zweite Bit jeweils 1 und das Ergebnis somit 1 ist. Beim zehnten Bit werden eine 1 und ein 0 verknüpft, was wieder 1 ergibt:
0B001000000010
-bor
0B000000000010
ergibt
0B001000000010
XOR daegen ist immer dann wahr, wenn die beiden Operanden unterschiedlich sind, das heißt wenn das eine Bit 1 ist und die andere 0 ist. Wenn beide gleich sind, ist das Ergebnis von XOR "falsch".
Die Wahrheitstabelle von XOR sieht so aus:
Eingabe 1 | Eingabe 2 | Ergebnis |
---|---|---|
Falsch | Falsch | Falsch |
Falsch | Wahr | Wahr |
Wahr | Falsch | Wahr |
Wahr | Wahr | Falsch |
Die folgende Operation zeigt die binäre Repräsentation von 514 und 2. Bis auf das vorderste sind alle Bits der beiden Zahlen gleich, so dass diese auf 0 auswerten. Nur das vorderste bleibt auf 1, weil seinen Gegenspieler 0 ist:
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Negation
Für die binäre Negation verwendet man den unären Operator -BNOT. Er dreht einfach alle Werte der jeweiligen Bits um, aus 1 wird 0 und aus 0 wird 1. Das Ergebnis von
-bnot 0B10000010
ist daher
0B01111101
Bits verschieben
PowerShell verfügt auch über Shift-Operatoren, um die Bits einer Binärzahl um beliebige Stellen nach links oder rechts zu verschieben. Der Aufruf
0B1000010 -shr 3
ergibt
0B0001000
Das zweite Bit von rechts fällt beim Verschieben um 3 Stellen nach rechts quasi hinten runter, und das linke Bit wandert bis zur vierten Stelle von rechts.
Der Operator -shl bewirkt das Gegenteil, durch das Verschieben nach links erhöht sich der Stellenwert der gesetzten Bits.
Zusammenfassung
PowerShell verfügt über einen vollständigen Satz von Bit-Operatoren aus -band, -bor, -bxor und -bnot. Hinzu kommen die beiden Shift-Operatoren zum Verschieben der Bits um beliebig viele Stellen nach links und rechts.
Wenn man direkt mit binären Zahlen hantieren möchte, dann benötigt man dafür PowerShell 7. Windows PowerShell unterstützt dies nicht.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links