www.wikidata.de-de.nina.az
In der Informatik ist ein bitweiser Operator ein Operator der auf ein oder zwei Bitketten Bitfeldern Bitfolgen oder Bitvektoren auf der Ebene der einzelnen Bits angewendet wird Insbesondere in den Programmiersprachen der C Familie konnen Binarzahlen ohne weitere syntaktische Kennzeichnung als Bitfolgen aufgefasst werden Die zugrunde liegenden Operationen auf den einzelnen Bits sind schaltungstechnisch die allereinfachsten und alle hoheren Operationen lassen sich auf sie zuruckfuhren Die bitweisen Operationen werden wegen ihrer geringeren Bedeutung fur die Geschwindigkeit eines Computersystems jedoch meist weniger durch Optimierung bevorzugt als die komplexeren arithmetischen Operationen wie Addition und Subtraktion Inhaltsverzeichnis 1 Bitweise Operatoren 1 1 NICHT 1 2 UND 1 3 ODER 1 4 XOR 2 Bitweise Verschiebungen 2 1 Logische Verschiebung 2 2 Arithmetische Verschiebung 2 3 Zyklische Verschiebung 2 3 1 Zyklische Verschiebung ohne Ubertragsbit 2 3 2 Zyklische Verschiebung mit Ubertragsbit 2 4 Verschiebeoperatoren in Programmiersprachen 2 4 1 C und C 2 4 2 Java 2 4 3 ARM Assembler 3 Anwendungen 4 Siehe auch 5 Weblinks 6 EinzelnachweiseBitweise Operatoren BearbeitenDie Sprechweise bitweise deutet darauf hin dass die mehrgliedrigen Eingabeoperanden komponentenweise verarbeitet werden Sie konnen naturlich auch eingliedrig sein Man kann davon ausgehen dass bei zweistelligen Operationen verschieden lange Operanden vom Kompiler als Fehler angesehen werden In vielen Programmiersprachen der C Familie wird syntaktisch und semantisch zwischen bitweise mehrgliedrig und komponentenweise und logisch boolesch eine einzige Komponente unterschieden Letztere werden wegen der naheliegenden Verwechslungsgefahr in diesem Artikel zusatzlich aufgefuhrt NICHT Bearbeiten Das bitweise NICHT oder Komplement ist eine einstellige Verknupfung die eine logische Negation Inversion jedes Bits durchfuhrt Wird die Bitfolge als Binarzahl aufgefasst dann ist dies die Bildung des Einerkomplements Jede 0 wird durch eine 1 ausgetauscht und umgekehrt Beispiel NICHT 0111 1000 In vielen Programmiersprachen der C Familie wird das bitweise NICHT als Tilde dargestellt Im Gegensatz dazu wird beim logischen Operator Ausrufezeichen fur logisches NICHT der gesamte Wert als Boolescher Ausdruck true 0 oder false 0 interpretiert Das logische NICHT ist keine bitweise Operation NICHT bitweise 0 1 1dez 0dez 5dez 0101bin 1010bin 10dez NICHT logisch false true true false 0 true 1dez false 5dez false UND Bearbeiten nbsp Bitweises UND von 4 BitDas bitweise UND wird auf zwei Bitfolgen gleicher Lange angewendet und gibt eine Bitfolge derselben Lange zuruck indem es jeweils Bits an der gleichen Stelle jeweils das erste Bit jeweils das zweite Bit usw mit einem logischen UND logische Konjunktion verknupft Bei jedem Paar ist das Ergebnisbit 1 falls beide Bits 1 sind ansonsten 0 Beispiel 0101 UND 0011 0001 In den mit C verwandten Programmiersprachen wird das bitweise UND durch amp kaufmannisches Und engl ampersand dargestellt Das boolesche Gegenstuck dazu das logische UND interpretiert jeden seiner zwei Operanden als einen booleschen Wert und wird als amp amp zwei kaufmannische Und dargestellt Das bitweise UND kann verwendet werden um eine Bitfolge zu maskieren Dadurch konnen Teile eines Bitstrings isoliert werden und man kann ermitteln ob ein bestimmtes Bit gesetzt ist oder nicht Beispiel 0011 Um herauszufinden ob das dritte Bit gesetzt ist oder nicht wird darauf ein bitweises UND mit einer Maske angewendet die an der dritten Position eine 1 enthalt 0011 UND 0010 0010 Da das Ergebnis nicht Null ist muss das dritte Bit in der ursprunglichen Bitfolge eine 1 gewesen sein Diese Anwendung des bitweisen UND wird bitweise Maskierung genannt weil Teile die nicht geandert werden sollen oder fur die Berechnung nicht wichtig sind ausgeblendet werden Das bitweise UND kann mit dem bitweisen NICHT kombiniert werden um Bits zu loschen Beispielsweise soll in der Bitfolge 0110 das zweite Bit geloscht d h auf 0 gesetzt werden sodass im Ergebnis 0010 herauskommt Dies geschieht indem wir eine invertierte Maske die Null muss dafur an der Stelle der zu andernden Ziffer gesetzt werden auf unsere Bitfolge anwenden Invertieren konnen wir mit dem NICHT Operator NICHT 0100 1011 Danach wird die Bitfolge und die Maske mittels UND Operator verknupft 0110 UND 1011 0010 Weiterhin ist es mit dem bitweisen UND moglich eine Binarzahl modulo 2k zu rechnen indem man sie mit 2k 1 UND verknupft Dadurch werden alle Bits ab der k ten Position von rechts auf 0 gesetzt Beispiel 17 mod 8 1 entspricht 010001 17 UND 000111 7 8 1 000001 ODER Bearbeiten nbsp Bitweises ODER von 4 BitDas bitweise ODER wird auf zwei Bitfolgen gleicher Lange angewendet und gibt eine Bitfolge derselben Lange zuruck indem es jeweils Bits an der gleichen Stelle mit einem logischen ODER logische Disjunktion verknupft Bei jedem Paar ist das Ergebnisbit 0 falls beide Bits 0 sind ansonsten ist das Ergebnisbit 1 Beispiel 0101 ODER 0011 0111 In den mit C verwandten Programmiersprachen wird das bitweise ODER durch senkrechter Strich dargestellt Das boolesche Gegenstuck dazu das logische ODER das seine Operanden als boolesche Werte interpretiert wird als zwei senkrechte Striche dargestellt Das bitweise ODER wird verwendet wenn mehrere Bits als Flags verwendet werden die Bits einer einzelnen Binarzahl konnen jeweils eine eigene boolesche Variable darstellen Wendet man das bitweise ODER auf einen solchen Binarwert und eine Maske an die an bestimmten Stellen eine 1 enthalt so erhalt man eine neue Bitfolge in der diese Bits zusatzlich zu den ursprunglich vorhandenen gesetzt sind Beispiel 0010 kann als Liste von vier Flags angesehen werden Das erste zweite und vierte Flag sind nicht gesetzt 0 das dritte Flag ist gesetzt 1 Das erste Flag kann gesetzt werden indem man diese Bitfolge mit einer Bitfolge verknupft die nur an der ersten Stelle eine 1 hat 0010 ODER 1000 1010 Diese Technik wird eingesetzt um Speicherplatz zu sparen wenn Programme sehr viele Boolesche Werte verwalten mussen XOR Bearbeiten nbsp Bitweises exklusives ODER von 4 BitDas bitweise exklusive ODER wird auf zwei Bitfolgen der gleichen Lange angewendet und gibt eine Bitfolge derselben Lange zuruck indem es die logische XOR Operation auf jedem Paar korrespondierender Bits durchfuhrt Das Ergebnisbit ist 1 falls die zwei Bits unterschiedlich sind und 0 falls sie gleich sind Beispiel 0101 XOR 0011 0110 In den mit C verwandten Programmiersprachen wird das bitweise XOR als Circumflex dargestellt Das boolesche Gegenstuck dazu das logische XOR das seine zwei Operanden jeweils als einen booleschen Wert auffasst wird als dargestellt In der Assemblersprache wird das bitweise XOR gelegentlich eingesetzt um den Wert eines Prozessorregisters auf 0 zu setzen Wendet man XOR auf zwei identische Operanden an so erhalt man immer 0 In vielen Architekturen benotigt diese Operation weniger Rechenzeit als man fur das Laden einer 0 und das Speichern im Register benotigt Das bitweise XOR kann auch verwendet werden um Flags in Bitfolgen umzuschalten Dazu fasst man den zweiten Operanden als NICHT Maske auf den ersten Operanden auf die diejenigen Stellen logisch invertiert an denen eine 1 steht und die anderen unverandert lasst Im Beispiel 0101 XOR 0011 Maske 0110 wird das dritte und vierte Flag umgeschaltet Diese Technik kann eingesetzt werden um Bitfolgen zu manipulieren die mehrere boolesche Variablen reprasentieren Bitweise Verschiebungen BearbeitenBei den bitweisen Verschiebungen engl bitwise shift werden die Bits als einzelne Zeichen an einer bestimmten Bit Position aufgefasst und nicht als Paare korrespondierender Bits wie in den oben stehenden Operationen Dabei bedeutet das Kollektiv der Bits bei der arithmetischen Verschiebung eine Binarzahl oder bei der etwas elementareren logischen Verschiebung eine Bitkette resp eine vorzeichenlose engl unsigned Binarzahl Der Hauptunterschied besteht in der Behandlung des eventuellen Vorzeichenbits Schaltungstechnisch konnen bitweise Verschiebungen und Rotationen um eine beliebige Stellenanzahl in Form von Barrel Shiftern realisiert werden Bei diesen Operationen werden die Binar Zeichen um eine angegebene Anzahl von Bitpositionen nach links oder rechts verschoben Die Richtungsangabe wird dabei unabhangig von der Rechnerarchitektur und deren Endianness immer in der big endian Standardkonvention des Dualsystems verstanden Links bedeutet Multiplikation und rechts Division mit einer Zweierpotenz Register der Prozessoren sowie Datentypen der Programmiersprachen beherbergen eine definierte endliche Anzahl von Bits weshalb die spezifizierte Anzahl an Bits an einem Ende aus dem Register oder Datum hinausgeschoben wahrend die gleiche Anzahl am anderen Ende hineingeschoben hereingezogen wird Auf diese Weise induzieren die bitweisen Verschiebungsoperationen eine Adressierung der Bits innerhalb eines Bytes BeispielSymbolik lt lt in einigen Sprachen shl Verschieben nach links um den jeweils dahinter angegebenen Wert gt gt in einigen Sprachen shr Verschieben nach rechts um den jeweils dahinter angegebenen WertIn Sprachen wie C wird fur Rechtsverschiebungen abhangig vom Datentyp und ggf Vorzeichen entweder mit Nullen unsigned oder nicht negativ oder mit Einsen signed und kleiner als Null aufgefullt Andere Programmiersprachen wie z B Java verwenden stattdessen einen eigenen Operator gt gt gt bei dem stets mit Nullen aufgefullt wird 00111100 lt lt 1 01111000 00111100 lt lt 2 11110000 signed erzeugt einen arithmetischen Uberlauf 11111100 lt lt 2 11110000 signed ohne arithmetischen Uberlauf 01001111 gt gt 1 00100111 11110000 gt gt 2 11111100 signed 11110000 gt gt 2 00111100 unsigned 11110000 gt gt gt 2 00111100 signed und unsigned 01001111 gt gt gt 1 00100111 signed und unsigned Eine logische oder arithmetische Verschiebung um n displaystyle n nbsp Bitpositionen nach links ist aquivalent zu einer Multiplikation mit 2 n displaystyle 2 n nbsp sofern keine 1 Bits hinaus bzw in die Vorzeichenposition hinein geschoben werden Ganzzahluberlauf Eine arithmetische Verschiebung um n displaystyle n nbsp Bitpositionen nach rechts ist aquivalent zu einer Division durch 2 n displaystyle 2 n nbsp hinausgeschobene 1 Bits gehen verloren 12 10 displaystyle mathrm 12 10 nbsp 00001100 lt lt 2 00110000 48 10 12 2 2 12 4 displaystyle mathrm 48 10 12 cdot 2 2 12 cdot 4 nbsp Dieses Verfahren stellt somit eine Alternative zur Multiplikation bzw Division mit Zweierpotenzen dar Divisionsergebnisse werden abgeschnitten Ebenfalls ist es moglich eine n Bit Zahl modulo 2k zu rechnen indem sie um jeweils n k nach links und wieder nach rechts verschiebt Etwas schneller noch kann man die modulo Berechnung uber das bitweise UND mit 2k 1 durchfuhren Eine Verschiebung um 0 Bitpositionen andert den Wert nicht identische Abbildung Ist fur m 0 n 0 displaystyle m geq 0 n geq 0 nbsp die Verschiebung um m n displaystyle m n nbsp Bitpositionen definiert dann gilt sowohl fur beidesmal logische wie fur beidesmal arithmetische Verschiebungen die Hintereinanderausfuhrung xyz gt gt m gt gt n xyz gt gt m n signed und unsigned xyz lt lt m lt lt n xyz lt lt m n signed und unsigned D h Abgesehen von der Einschrankung uber die Maximalzahl der Schiebepositionen ab der das Verhalten implementierungsabhangig und undefiniert sein kann genugt es das Verhalten der Schiebeoperationen fur eine einzige Schiebeposition zu definieren Logische Verschiebung Bearbeiten Hauptartikel Logische Verschiebung nbsp Logischer Rechtsshift nbsp Logischer LinksshiftBei einer logischen Verschiebung engl logic shift werden die hinausgeschobenen Bits verworfen und Nullen nachgezogen unabhangig von Schieberichtung und Vorzeichen Deshalb sind logische und arithmetische Verschiebung nach links bis auf die eventuelle Setzung von Flags identische Operationen Bei der logischen Verschiebung nach rechts werden jedoch Nullen statt Kopien des Vorzeichenbits eingefugt Daher wird die logische Verschiebung bei Bitketten oder vorzeichenlosen Binarzahlen eingesetzt wahrend arithmetische Verschiebungen bei vorzeichenbehafteten Zweierkomplementzahlen verwendet werden Arithmetische Verschiebung Bearbeiten nbsp Arithmetischer Rechtsshift nbsp Arithmetischer LinksshiftIm Gegensatz zur logischen Verschiebung hat bei der arithmetischen manchmal auch algebraischen Verschiebung engl arithmetic shift das hochstwertige Bit die Rolle des Vorzeichens in der Darstellung als Zweierkomplement Der zugrunde liegende Datentyp ist die vorzeichenbehaftete signed binare Ganzzahl fur die der Compiler den arithmetischen Shift generiert Hinausgeschobene Bits gehen verloren Bei einer Verschiebung nach rechts werden Kopien des Vorzeichenbits an der Vorzeichenstelle eingeschoben engl sign propagation bei einer Verschiebung nach links werden auf der rechten Seite Nullen nachgezogen Beispiel 4 Bit Register 1100 RECHTS SHIFT um 1 1110 0110 LINKS SHIFT um 1 1100 Bei der Rechtsverschiebung wird das niedrigstwertige das in der konventionellen Binardarstellung am weitesten rechts stehende das Einer Bit hinausgeschoben und das hochstwertige Bit MSB das Vorzeichenbit am hochwertigen linken Ende erneut eingefugt wodurch das Vorzeichen der Zahl erhalten bleibt Bei der Linksverschiebung wird eine neue 0 am niedrigwertigen rechten Ende eingefugt und das hochstwertige Bit aus dem Register hinausgeschoben Ist das neue Vorzeichenbit verschieden vom zuletzt hinausgeschobenen wechselt also das Vorzeichen beim letzten Schiebevorgang dann wird in vielen Rechnerfamilien das Uberlauf oder Carry Flag gesetzt andernfalls geloscht Eine arithmetische Verschiebung um n displaystyle n nbsp Bitpositionen nach links ist aquivalent zu einer Multiplikation mit 2 n displaystyle 2 n nbsp sofern kein Uberlauf auftritt Eine arithmetische Verschiebung einer vorzeichenbehafteten signed Binarzahl Zweierkomplementzahl um n displaystyle n nbsp nach rechts entspricht einer ganzzahligen Division durch 2 n displaystyle 2 n nbsp mit Rundung auf die nachstkleinere Zahl Beispiele 1 gt gt 1 1 gt gt 31 0 und 1 gt gt 1 1 gt gt 31 1 Zyklische Verschiebung Bearbeiten Zyklische Verschiebung ohne Ubertragsbit Bearbeiten nbsp Zyklischer Rechtsshift nbsp Zyklischer LinksshiftEine andere Form der bitweisen Verschiebung ist die zyklische Verschiebung engl circular shift oder bitweise Rotation Bei dieser Operation rotieren die Bits als ob das linke und das rechte Ende verbunden waren Das Bit das hineingeschoben wird hat denselben Wert wie das Bit das aus dem Register hinausgeschoben wird Diese Operation erhalt alle existierenden Bits und wird in einigen Verfahren der digitalen Kryptographie eingesetzt beispielsweise beim AES Verfahren von und nach seinen Entwicklern auch Rijndael genannt In elementarer Form jedoch nicht auf Bitebene sondern auf der Basis eines Alphabets wird sie in der Verschiebechiffre angewendet Zyklische Verschiebung mit Ubertragsbit Bearbeiten nbsp Zyklischer Rechtsshift mit Ubertragsbit C Carry nbsp Zyklischer Linksshift mit Ubertragsbit C Carry Zyklische Verschiebung mit Ubertragsbit engl rotate through carry funktioniert ahnlich wie die zyklische Verschiebung ohne Ubertragsbit jedoch werden die beiden Enden des Registers behandelt als ob sie durch das Ubertragsbit getrennt werden Das Carry Bit wird in das Register hineingeschoben das aus dem Register hinausgeschobene Bit wird zum neuen Ubertragsbit Eine einzelne zyklische Verschiebung mit Ubertragsbit kann eine logische oder arithmetische Verschiebung um eine Stelle simulieren wenn das Ubertragsbit vorher entsprechend gesetzt wird Enthalt das Ubertragsbit beispielsweise eine 0 dann entspricht die Verschiebung nach rechts einer arithmetischen Verschiebung nach rechts Aus diesem Grund sind bei manchen Mikroprozessoren wie dem PICmicro nur Befehle fur die beiden zyklischen Verschiebungsoperationen implementiert es gibt keine speziellen Befehle fur arithmetische oder logische Verschiebungen Zyklische Verschiebung mit Ubertragsbit ist besonders nutzlich wenn Verschiebungen mit Zahlen durchgefuhrt werden die grosser als die Wortbreite des Prozessors sind weil die Zahl dann in zwei Registern gespeichert wird und das aus einem Register hinausgeschobene Bit in das andere Register hineingeschoben werden muss Bei zyklischer Verschiebung mit Ubertragsbit wird dieses Bit bei der ersten Verschiebung im Ubertragsbit gespeichert und bei der nachsten Verschiebung weitergegeben ohne dass zusatzliche Instruktionen notwendig sind Verschiebeoperatoren in Programmiersprachen Bearbeiten C und C Bearbeiten In C C und verwandten Sprachen werden die Verschiebungsoperatoren durch lt lt und gt gt dargestellt Die Anzahl der Verschiebungen wird als zweiter Operand ubergeben Beispiel x y lt lt 2 weist der Variable x das Ergebnis der bitweisen Verschiebung von y um zwei Stellen nach links zu Dies fuhrt zum selben Ergebnis wie x y 4 In C und C verwenden Berechnungen mit vorzeichenlosen Werten logische Verschiebungen Berechnungen mit vorzeichenbehafteten Werten verhalten sich abhangig von der Implementierung engl implementation defined behavior sofern der rechte Operand negativ ist durch einen Linksshift sich das Vorzeichen andert oder ein negativer Wert einem Rechtsshift unterzogen wird 1 Ebenso ist das Ergebnis laut C und C Sprachnorm undefiniert wenn die Anzahl der Bitverschiebungen grosser oder gleich der Bitbreite der Rechenarchitektur ist 2 Wird beispielsweise auf einer 32 Bit Architektur von Intel Prozessoren gearbeitet IA32 so bewirkt eine Verschiebung um 32 Stellen oft gar keine Veranderung des Ergebnisses d h fur x y lt lt 32 ergibt sich x y Der Grund liegt in der Art und Weise wie die Compiler die Schiebeoperation in Maschinencode umsetzen Die meisten Prozessoren haben direkte Befehle zum Schieben von Bits wobei die Anzahl der Verschiebungen nur in begrenzter Breite im Maschinenbefehl codiert wird Fur IA32 sind z B 5 Bitstellen vorgesehen um die Zahl der Verschiebungen abzulegen 3 Daher konnen nur Verschiebungen im Bereich 0 bis 31 korrekt ausgefuhrt werden Entsprechende Beschrankungen konnen fur andere Architekturen und Datentypen ebenso vorhanden sein Java Bearbeiten In Java sind alle Ganzzahl Datentypen vorzeichenbehaftet und die Operatoren lt lt und gt gt fuhren arithmetische Verschiebungen durch In Java gibt es zusatzlich den Operator gt gt gt der eine logische Rechtsverschiebung durchfuhrt Da logische und arithmetische Linksverschiebungen identisch sind gibt es keinen lt lt lt Operator ARM Assembler Bearbeiten In ARM Assembler werden die Verschiebungsoperatoren durch LSL Logical Shift Left LSR Logical Shift Right und ASR Arithmetic Shift Right dargestellt Fur die zyklischen Verschiebungen gibt es die beiden Befehle ROR ROtate Right ohne Ubertragsbit und RRX Rotate Right eXtended mit Ubertragsbit Anwendungen BearbeitenObwohl Rechner oft effiziente Befehle zur Ausfuhrung von arithmetischen und logischen Operationen eingebaut haben konnen alle diese Operationen auch durch Kombinationen von bitweisen Operatoren und Nullvergleichen durchgefuhrt werden Folgender Pseudocode zeigt beispielsweise wie zwei beliebige Ganzzahlen a und b nur mithilfe von Verschiebungen und Additionen multipliziert werden konnen c 0 solange b 0 falls b und 1 0 c c a schiebe a um 1 nach links schiebe b um 1 nach rechts return c Der Code fuhrt eine schriftliche Multiplikation im Binarsystem aus allerdings in der unublichen Reihenfolge von hinten nach vorne beginnend mit der letzten Ziffer von b Siehe auch Schriftliche Multiplikation im BinarsystemEine sehr interessante Anwendung des bitweisen XOR ist die Gewinnstrategie des Nim Spiels bei der die Anzahlen sowohl als Binarzahlen wie als Bitketten zu behandeln sind Siehe auch BearbeitenBoolesche Algebra Boolescher Operator Logikgatter Logischer OperatorWeblinks BearbeitenDivision durch bitweise Verschiebung englisch Einzelnachweise Bearbeiten ISO IEC Standard C programming language Abschnitt 6 5 7 5 englisch A7 8 Shift Operators Appendix A Reference Manual The C Programming Language SAL SAR SHL SHR Shift Chapter 4 Instruction Set Reference IA 32 Intel Architecture Software Developer s Manual Abgerufen von https de wikipedia org w index php title Bitweiser Operator amp oldid 230632160