8.6 Bitweise Operatoren
Die bitweisen Operatoren sind für binäre Berechnungen nützlich. Alle Daten in einem Computer werden letztendlich binär gespeichert und bestehen nur aus Nullen und Einsen (Dualzahlen bzw. Binärzahlen). Normalerweise kommen Sie in Ihren Projekten nur sehr selten mit dieser Darstellung der Daten in Berührung.
Die bitweise Verarbeitung macht immer dann Sinn, wenn für die Verwaltung von Daten viele Wahrheitswerte notwendig wären oder wenn sich Berechnungen durch Bitverschiebungen optimieren lassen:
// Zustände über Wahrheitswerte speichern
umschalt = Key.isDown(Key.SHIFT);
strg = Key.isDown(Key.CONTROL);
// Zustände bitweise in einer Variablen verwalten
// Erstes Bit steht für die Umschalttaste und das zweite für Strg
tasten = 1*Key.isDown(Key.SHIFT)+2*Key.isDown(Key.CONTROL);
// Normale Multiplikation mit 2
ergebnis = 2*99;
// Multiplikation mit 2 durch Bitverschiebung
ergebnis = 99 << 1;
Tastenkürzel verwalten
Das folgende Beispiel in Form einer ActionScript 2.0-Klasse beschreibt ebenfalls eine kompakte Möglichkeit, mit Hilfe von binär dargestellten Werten Tastenkürzel zu verwalten. Der Vorteil ist hier, dass für verschiedenen Tasten nur eine einzige Variable benötigt wird (Modifiers), deren einzelne Stellen (Bits) für jeweils eine mögliche Taste stehen, die frei kombiniert werden können:
// Verwendung: my_shortcut = new Shortcut (78, [Shortcut.CTRL, Shortcut.SHIFT]);
class Shortcut {
/**
* Statische Variablen für Modifier-Tasten
*/
// 00101
public static var SHIFT = 5;
// 01001
public static var CTRL = 9;
// In Flash nur als ALT GR verfügbar (keycode 18)
// 10001
public static var ALT = 17;
/**
* Öffentliche Variablen
*/
// Taste (immer nur eine erlaubt)
public var key:Number = null;
// Modifier-Tasten (Kombination erlaubt)
public var modifiers:Number = null;
//
function Shortcut(keyCode:Number, modifier_list:Array)
{
// Initialisiere mit Array für die Modifier-Tasten
init(keyCode, modifier_list);
}
private function init(keyCode:Number, modifier_list:Array)
{
// modifier_list ist ein Array aus Shortcut.SHIFT, Shortcut.CTRL oder Shortcut.ALT (vermeide ALT)
key = keyCode;
modifiers = getModifierFlags(modifier_list);
}
private function getModifierFlags(modifier_list:Array):Number
{
var flags:Number;
var i:Number;
//
flags = 1;
for (i in modifier_list)
{
flags = flags | modifier_list[i];
}
return flags;
}
}
8.6.1 ~ (Bit-Komplement)
Der einstellige Operator ~ berechnet das Komplement eines binären Ausdrucks. Das logische Nicht beschränkt sich bei der Anwendung immer nur auf eine Bedingung. Um nun mehrere Bedingungen nicht in vielen Einzelschritten negieren zu müssen, bietet sich die bitweise Verarbeitung an, die das »in einem Rutsch« erledigt.
|
Bemerkung: |
|
Dieser Operator steht seit dem Flash Player 5 zur Verfügung. |
|
|
|
Syntax: |
~ausdruck
|
Parameter: |
|
Der Ausdruck steht für einen beliebigen Datentyp. |
|
|
|
Ergebnis: |
|
ActionScript wandelt den Ausdruck in eine 32-Bit-Zahl um und gibt das Komplement zurück. |
|
|
8.6.2 << (bitweise Verschiebung nach links)
Der Operator << verschiebt den binären Wert eines Ausdrucks bitweise nach links. Dies entspricht einer Multiplikation mit einem Vielfachen von zwei.
|
Bemerkung: |
|
Dieser Operator steht seit dem Flash Player 5 zur Verfügung. |
|
|
|
Syntax: |
ausdruck << verschiebung
|
Parameter: |
|
Der Ausdruck steht für eine Zahl. Als Verschiebung wird eine Zahl zwischen 0 und 31 erwartet. |
|
|
|
Ergebnis: |
|
Der Wert des Ausdrucks wird in eine 32-Bit-Zahl konvertiert und um die angegebenen Bits nach links verschoben. |
|
|
|
Beispiel: |
wert = 16;
// Verschiebe Bits
trace(wert << 2);
// Ergebnis ist 64
8.6.3 >> (bitweise Verschiebung nach rechts)
Der Operator >> verschiebt den binären Wert eines Ausdrucks bitweise nach rechts. Dies entspricht einer Division mit einem Vielfachen von zwei.
|
Bemerkung: |
|
Dieser Operator steht seit dem Flash Player 5 zur Verfügung. |
|
|
|
Syntax: |
ausdruck >> verschiebung
|
Parameter: |
|
Der Ausdruck steht für eine Zahl. Als Verschiebung wird eine Zahl zwischen 0 und 31 erwartet. |
|
|
|
Ergebnis: |
|
Der Wert des Ausdrucks wird in eine 32-Bit-Zahl konvertiert und um die angegebenen Bits nach rechts verschoben. |
|
|
|
Beispiel: |
wert = 16;
// Verschiebe Bits
trace(wert >> 2);
// Ergebnis ist 4
8.6.4 >>> (vorzeichenlose bitweise Verschiebung nach rechts)
Der Operator >>> verschiebt einen Wert bitweise nach rechts, ohne dabei auf ein Vorzeichen zu achten. Dies entspricht einer Division durch ein Vielfaches von zwei.
|
Bemerkung: |
|
Dieser Operator steht seit dem Flash Player 5 zur Verfügung. |
|
|
|
Syntax: |
ausdruck >>> verschiebung
|
Parameter: |
|
Der Ausdruck steht für eine Zahl. Als Verschiebung wird eine Zahl zwischen 0 und 31 erwartet. |
|
|
|
Ergebnis: |
|
Der Wert des Ausdrucks wird in eine 32-Bit-Zahl konvertiert und um die angegebenen Bits nach rechts verschoben, ohne dabei das Vorzeichen (das 32. Bit) beizubehalten. |
|
|
|
Beispiel: |
// Aktiviere das 32. Bit (dieses steht für das Vorzeichen)
// 10000000 00000000 00000000 00000000
schalter = Math.pow(2,31);
// Verschiebe Bits um eine Stelle nach rechts (behalte Vorzeichen bei)
schalter = schalter >> 1;
// Ergebnis ist 11000000 00000000 00000000 00000000
trace(-Math.pow(2,30));
trace(schalter);
// Aktiviere das 32. Bit (dieses steht für das Vorzeichen)
// 10000000 00000000 00000000 00000000
schalter = Math.pow(2,31);
// Verschiebe Bits um eine Stelle nach rechts
schalter = schalter >>> 1;
// Ergebnis ist 01000000 00000000 00000000 00000000
trace(Math.pow(2,30));
trace(schalter);
8.6.5 & (bitweises Und, String-Verknüpfung in Flash4)
Der Operator & verknüpft die binäre Darstellung zweier Ausdrücke bitweise mit einem Und. In der Flash 4-Entwicklungsumgebung wurde dieser Operator für die Verknüpfung von Zeichenketten verwendet.
|
Bemerkung: |
|
Dieser Operator steht in der Flash 4-Entwicklungsumgebung für die Verknüpfung von Zeichenketten zur Verfügung. Verwenden Sie ab Flash 5 stattdessen den +-Operator. |
|
|
|
Dieser Operator steht seit dem Flash Player 5 für die bitweise Und-Verknüpfung zur Verfügung. Die Arbeitsweise dieses Operators ist dem logischen Und (!) ähnlich. |
|
|
|
Syntax: |
ausdruck & ausdruck
|
Parameter: |
Die Ausdrücke stehen für beliebige Datentypen.
|
Ergebnis: |
|
ActionScript wandelt die Ausdrücke in eine 32-Bit-Zahl um und gibt das bitweise Und zurück. |
|
|
Tabelle 8.9
Und-Tabelle (bitweise)
Ausdruck 1
|
Ausdruck 2
|
Ergebnis
|
1
|
1
|
1
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
|
Beispiel: |
// Erzeuge binäre Zahlen
a = parseInt("0101", 2);
b = parseInt("1001", 2);
// Bitweises Und
trace(a & b);
// Ergebnis ist: 0001 (Dezimal 1)
8.6.6 ^ (bitweises XOder)
Der Operator ^ verknüpft die binäre Darstellung zweier Ausdrücke bitweise mit einem XOder (Entweder-Oder).
|
Bemerkung: |
|
Dieser Operator steht seit dem Flash Player 5 zur Verfügung. |
|
|
|
Syntax: |
ausdruck ^ ausdruck
|
Parameter: |
Die Ausdrücke stehen für beliebige Datentypen.
|
Ergebnis: |
|
ActionScript wandelt die Ausdrücke in eine 32-Bit-Zahl um und gibt das bitweise XOder zurück. |
|
|
Tabelle 8.10
XOder-Tabelle (bitweise)
Ausdruck 1
|
Ausdruck 2
|
Ergebnis
|
1
|
1
|
0
|
1
|
0
|
1
|
0
|
1
|
1
|
0
|
0
|
0
|
|
Beispiel: |
// Erzeuge binäre Zahlen
a = parseInt("0101", 2);
b = parseInt("1001", 2);
// Bitweises XOder
trace(a ^ b);
// Ergebnis ist: 1100 (Dezimal 12)
8.6.7 | (bitweises Oder)
Der Operator | verknüpft die binäre Darstellung zweier Ausdrücke bitweise mit einem Oder.
|
Bemerkung: |
|
Dieser Operator steht seit dem Flash Player 5 zur Verfügung. |
|
|
|
Syntax: |
ausdruck | ausdruck
|
Parameter: |
Die Ausdrücke stehen für beliebige Datentypen.
|
Ergebnis: |
|
ActionScript wandelt die Ausdrücke in eine 32-Bit-Zahl um und gibt das bitweise Oder zurück. |
|
|
Tabelle 8.11
Oder-Tabelle (bitweise)
Ausdruck 1
|
Ausdruck 2
|
Ergebnis
|
1
|
1
|
1
|
1
|
0
|
1
|
0
|
1
|
1
|
0
|
0
|
0
|
|
Beispiel: |
// Erzeuge binäre Zahlen
a = parseInt("0101", 2);
b = parseInt("1001", 2);
// Bitweises Oder
trace(a | b);
// Ergebnis ist: 1101 (Dezimal 13)
|