Ist das resultierende Muster die korrekte Darstellung für -16/4 Nein. Das Ergebnis repräsentiert eine große positive Zahl, nicht -4 Shift Right Arithmetic Ein rechts verschobenes logisches kann nicht verwendet werden, um eine negative ganze Zahl durch zwei zu teilen. Das Problem besteht darin, daß ein logisches Verschiebungsrecht Nullen in das Bit hoher Ordnung bewegt. Dies ist in einigen Situationen wünschenswert, jedoch nicht zum Dividieren von negativen ganzen Zahlen, bei denen das Bit hoher Ordnung das Vorzeichenbit ist. Eine arithmetische Rechtsverschiebung repliziert das Vorzeichenbit nach Bedarf, um Bitpositionen zu füllen: FRAGE 13: Gibt es eine Arithmetikverschiebung links Anweisung Wenn Sie nach links verschieben, gibt es keinen Unterschied zwischen arithmetischer und logischer Verschiebung. Beim Rechtsschieben hängt die Art der Verschiebung vom Typ des zu verschiebenden Wertes ab. (Als Hintergrund für jene Leser, die mit dem Unterschied nicht vertraut sind, verschiebt eine logische Rechtsverschiebung um 1 Bit alle Bits nach rechts und füllt das linkste Bit mit einer 0. Eine arithmetische Verschiebung verlässt den ursprünglichen Wert im linken Bit Wichtig beim Umgang mit negativen Zahlen.) Beim Verschieben eines vorzeichenlosen Wertes ist der Operator in C eine logische Verschiebung. Beim Verschieben eines signierten Wertes ist der Operator eine arithmetische Verschiebung. Zum Beispiel, unter der Annahme einer 32-Bit-Maschine: beantwortet Aug 11 08 um 9:16 So schließen, Greg. Ihre Erklärung ist nahezu perfekt, aber Verschieben eines Ausdrucks von signierten Typ und negativen Wert ist implementiert-definiert. Siehe ISO / IEC 9899: 1999 Abschnitt 6.5.7. Ndash Rob 22:22 Rob: Eigentlich, für Linkshänder und unterschriebene negative Zahl, ist das Verhalten undefiniert. Ndash JeremyP Apr 4 12 at 15:24 Tatsächlich führt die linke Verschiebung auch zu einem nicht definierten Verhalten für positiv signierte Werte, wenn der resultierende mathematische Wert (der in der Bitgröße nicht begrenzt ist) als positiver Wert in diesem signierten Typ dargestellt werden kann. Die Quintessenz ist, dass Sie sorgfältig vorgehen müssen, wenn Sie rechts einen signierten Wert verschieben. Ndash Michael Burr Jun 21 13 um 0:30 Shifting First ist der Unterschied zwischen logischen und arithmetischen Verschiebungen von einer mathematischen Sicht, ohne sich Gedanken über Datentyp Größe. Logische Verschiebungen füllen immer ausgelassene Bits mit Nullen, während die arithmetische Verschiebung sie mit Nullen nur für die linke Verschiebung füllt, aber für die rechte Verschiebung kopiert sie das MSB, wodurch das Vorzeichen des Operanden bewahrt wird (unter der Annahme einer Zweierkomplement-Codierung für negative Werte). Mit anderen Worten, die logische Verschiebung betrachtet den verschobenen Operanden nur als einen Strom von Bits und verschiebt sie, ohne sich um das Vorzeichen des resultierenden Werts zu kümmern. Arithmetische Verschiebung betrachtet es als eine (unterzeichnete) Zahl und bewahrt das Zeichen, wie Verschiebungen gebildet werden. Eine linke arithmetische Verschiebung einer Zahl X durch n entspricht der Multiplikation von X mit 2 n und ist somit gleichbedeutend mit der logischen Linksverschiebung eine logische Verschiebung würde auch das gleiche Ergebnis ergeben, da MSB sowieso vom Ende abfällt und theres nichts zu bewahren hat. Eine rechte Arithmetikverschiebung einer Zahl X durch n ist äquivalent zu einer ganzzahligen Division von X durch 2 n NUR, wenn X nichtnegativ ist. Integer-Division ist nichts anderes als mathematische Teilung und runde gegen 0 (trunc). Bei negativen Zahlen, die durch die Zwei-Komplement-Kodierung dargestellt werden, hat die Verschiebung nach rechts um n Bits den Effekt, sie mit 2 n mathematisch zu dividieren und auf (Boden) zu runden, so daß die Rechtsverschiebung für nichtnegative und negative Werte unterschiedlich ist. Für X 0, X n X / 2 n trunc (X 2 n) für X lt 0, X n Etage (X 2 n) wobei mathematische Division, / eine ganzzahlige Division ist. Schauen wir uns ein Beispiel an: 37/2 18 (Abrundung 18,5 gegen 0) 10010) 2 Ergebnis der arithmetischen Rechtsverschiebung -37) 10 11011011) 2 (unter Berücksichtigung eines Zweierkomplements, 8-Bit-Darstellung) -37 / 2 -18 (Rundung 18.5 gegen 0) 11101110) 2 NICHT das Ergebnis der arithmetischen Rechtsverschiebung -37 1 -19 (Rundung 18.5 nach) 11101101) 2 Ergebnis der arithmetischen Rechtsverschiebung Wie Guy Steele betonte. Diese Diskrepanz hat zu Bugs in mehr als einem Compiler geführt. Hier kann nicht-negativ (math) auf unsignierte und signierte nichtnegative Werte (C) abgebildet werden, beide werden gleich behandelt und rechtsverschoben wird durch Integer-Division durchgeführt. So logisch und arithmetisch sind bei linksverschobenen und für nichtnegativen Werten im rechten Verschieben seine in der rechten Verschiebung von negativen Werten, die sie unterscheiden, äquivalent. Operanden - und Ergebnistypen Standard C99 6.5.7: Jeder der Operanden muss Integer-Typen haben. Die Integer-Promotions werden auf jedem der Operanden ausgeführt. Der Typ des Ergebnisses ist der des geförderten linken Operanden. Wenn der Wert des rechten Operanden negativ ist oder größer oder gleich der Breite des geförderten linken Operanden ist, ist das Verhalten undefiniert. Im obigen Snippet werden beide Operanden int (aufgrund von Integer Promotion), wenn E2 negativ war oder E2 sizeof (int) CHARBIT dann ist die Operation undefined. Dies liegt daran, dass das Verschieben von mehr als die verfügbaren Bits sicher überlaufen wird. Had R wurde als kurz erklärt. Würde das int-Ergebnis der Verschiebeoperation implizit in eine kurze verengte Umwandlung umgewandelt werden, die zu implementierungsdefiniertem Verhalten führen kann, wenn der Wert nicht im Zieltyp darstellbar ist. Linke Verschiebung Das Ergebnis von E1 ltlt E2 ist E1 linksseitig verschobene E2-Bitpositionen, die frei gelassen werden, werden mit Nullen gefüllt. Wenn E1 einen unsignierten Typ hat, ist der Wert des Ergebnisses E12 E2. Reduzierte modulo eins mehr als der Maximalwert, der in der Ergebnistyp darstellbar ist. Wenn E1 einen signierten Typ und einen nicht-negativen Wert hat und E12 E2 im Ergebnistyp darstellbar ist, dann ist das der resultierende Wert andernfalls das Verhalten undefiniert. Da linke Verschiebungen für beide gleich sind, werden die freien Bits einfach mit Nullen gefüllt. Dann heißt es, daß für unsignierte und signierte Typen eine arithmetische Verschiebung vorliegt. Ich interpretiere es als arithmetische Verschiebung, da logische Verschiebungen sich nicht um den durch die Bits repräsentierten Wert kümmern, sondern schaut ihn nur als einen Bitsstrom an, aber der Standard spricht nicht in Form von Bits, sondern indem er ihn in Bezug auf den Wert, der erhalten wird, definiert Das Produkt von E1 mit 2 E2. Der Vorbehalt hierbei ist, dass bei signierten Typen der Wert nicht negativ sein sollte und der resultierende Wert im Ergebnistyp darstellbar sein sollte. Andernfalls ist die Operation undefiniert. Der Ergebnistyp wäre der Typ des E1 nach dem Integralförderung und nicht dem Ziel (die Variable, die das Ergebnis halten soll). Der resultierende Wert wird implizit in den Zieltyp konvertiert, wenn er in diesem Typ nicht repräsentativ ist, dann wird die Umsetzung implementiert (C99 6.3.1.3/3). Wenn E1 ein signierter Typ mit einem negativen Wert ist, dann ist das Verhalten der linken Verschiebung undefiniert. Dies ist ein einfacher Weg zu undefiniertem Verhalten, das leicht übersehen werden kann. Rechtsverschiebung Das Ergebnis von E1 E2 ist E1 rechtsverschobene E2-Bitpositionen. Wenn E1 einen unsignierten Typ hat oder wenn E1 einen signierten Typ und einen nicht-negativen Wert hat, ist der Wert des Ergebnisses der integrale Teil des Quotienten von E1 / 2 E2. Wenn E1 einen signierten Typ und einen negativen Wert hat, ist der resultierende Wert implementierungsdefiniert. Rechte Verschiebung für unsignierte und signierte nicht-negative Werte sind ziemlich gerade, die leeren Bits sind mit Nullen gefüllt. Für signierte negative Werte ist das Ergebnis der Rechtsverschiebung implementierungsdefiniert. Das heißt, die meisten Implementierungen wie GCC und Visual C implementieren rechts-Verschieben als arithmetische Verschiebung durch die Erhaltung der Zeichen-Bit. Fazit Im Gegensatz zu Java, das einen speziellen Operator gtgtgt für logische Verschiebung außer dem üblichen gtgt und ltlt hat. C und C haben nur arithmetische Verschiebung mit einigen Bereichen links undefiniert und Umsetzung definiert. Der Grund, warum ich sie für Arithmetik halte, liegt an der standardmäßigen Formulierung der Operation mathematisch, anstatt den verschobenen Operanden als einen Strom von Bits zu behandeln. Dies ist vielleicht der Grund, warum es diese Bereiche un / implementierungsdefiniert zurücklässt, anstatt nur alle Fälle als logisch zu definieren verschiebt. Nun, ich sah es auf wikipedia. Und sie haben dies zu sagen: C, hat aber nur einen rechten Schichtoperator,. Viele C-Compiler entscheiden, welche Rechtsverschiebung durchgeführt werden soll, abhängig davon, welche Art von Integer verschoben wird, oft werden signierte Ganzzahlen mit der arithmetischen Verschiebung verschoben, und unsigned Integers werden mit der logischen Verschiebung verschoben. So klingt es wie es hängt von Ihrem Compiler. Auch in diesem Artikel, beachten Sie, dass linke Verschiebung ist die gleiche für arithmetische und logische. Ich würde empfehlen, einen einfachen Test mit einigen signierten und unsigned Zahlen am Rand Fall (High-Bit-Satz natürlich) und sehen, was das Ergebnis auf Ihrem Compiler ist. Ich würde auch empfehlen vermeiden, je nachdem, ob es die eine oder andere, da es scheint, C hat keinen Standard, zumindest wenn es vernünftig und möglich ist, eine solche Abhängigkeit zu vermeiden. Antwort # 2 am: August 11, 2008 at 9:18 Obwohl die meisten C-Compiler verwendet, um eine arithmetische Linksverschiebung für signierte Werte haben, scheint dieses hilfreiche Verhalten veraltet worden zu sein. Gegenwärtige Compilerphilosophie scheint, anzunehmen, daß die Leistung einer Linksverschiebung auf einer Variablen einen Compiler berechtigt, anzunehmen, daß die Variable nicht-negativ sein muß und folglich irgendeinen Code an anderer Stelle weglassen würde, der für korrektes Verhalten notwendig wäre, wenn die Variable negativ war . Ndash supercat Apr 16 15 am 5:47 Linke Verschiebung ltlt Das ist irgendwie einfach und wann immer du den Schichtoperator benutzt, ist es immer eine bitweise Operation, so dass wir es nicht mit einem Doppel - und Schwimmerbetrieb verwenden können. Sobald wir eine Null verschoben haben, wird sie immer dem niedrigstwertigen Bit (LSB) hinzugefügt. Aber in der Rechtsverschiebung müssen wir einer weiteren Regel folgen und diese Regel wird als Vorzeichen-Bit-Kopie bezeichnet. Bedeutung der Vorzeichenbitkopie ist, wenn das höchstwertige Bit (MSB) gesetzt ist, dann nach einer Rechtsverschiebung wieder das MSB gesetzt wird, wenn es zurückgesetzt wurde, wird es wieder zurückgesetzt, bedeutet, wenn der vorhergehende Wert Null war, dann nach dem Verschieben wieder die Bit Null ist, wenn das vorherige Bit eins war, dann nach der Verschiebung wieder eins ist. Diese Regel gilt nicht für eine Linksverschiebung. Das wichtigste Beispiel für die Rechtsverschiebung, wenn Sie eine beliebige negative Zahl nach rechts verschieben, dann verschiebt sich nach einigen Verschiebungen der Wert schließlich auf Null und danach verschiebt sich diese -1 jede beliebige Anzahl von Malen, die der Wert gleich bleibt. Bitte prüfe. Beantwortet Mar 30 14 um 11: 04Schiebe die Bits von einem B-Schritte nach rechts (jeder Schritt bedeutet, dass durch zwei Ziffern) Bit-Verschiebung in PHP ist Arithmetik. Von jedem Ende verschobene Bits werden verworfen. Bei den linken Verschiebungen sind Nullen auf der rechten Seite verschoben, während das Vorzeichen-Bit nach links verschoben wird, was bedeutet, daß das Vorzeichen eines Operanden nicht erhalten bleibt. Bei Rechtsverschiebungen sind Kopien des Vorzeichenbits links verschoben, dh das Vorzeichen eines Operanden bleibt erhalten. Verwenden Sie Klammern, um die gewünschte Präzision zu gewährleisten. Beispielsweise wertet ein Amp b true die Äquivalenz dann bitweise aus und while (a amp b) true wertet die bitweise und dann die Äquivalenz aus. Sind beide Operanden für den Amp. Und Operatoren sind Zeichenfolgen, dann wird die Operation an den ASCII-Werten der Zeichen ausgeführt, aus denen die Zeichenfolgen bestehen, und das Ergebnis wird ein String sein. In allen anderen Fällen werden beide Operanden in ganze Zahlen konvertiert und das Ergebnis ist eine Ganzzahl. Wenn der Operand für den Operator ein String ist, wird die Operation an den ASCII-Werten der Zeichen ausgeführt, die den String bilden, und das Ergebnis ist ein String, ansonsten werden der Operand und das Ergebnis als Ganzzahlen behandelt. Beide Operanden und das Ergebnis für die Operatoren ltlt und gtgt werden immer als Ganzzahlen behandelt. Beispiel 1 Bitweise AND-, ODER - und XOR-Operationen auf Ganzzahlen ltphp / Ignoriere den oberen Abschnitt, es ist nur eine Formatierung, um die Ausgabe klarer zu machen. / Format (12d 104b) (22d 204b). 3s (42d 404b). n Werte Array (0. 1. 2. 4. 8) Test 1 4 echo n bitweise UND n foreach (Werte als Wert) Ergebniswert Amp Test printf (Format. Ergebnis. Wert. Amp. Test) echo n Bitwise Inclusive OR n foreach (Werte als Wert) Ergebniswert Test printf (Format. Ergebnis. Wert.. Test) echo n bitweise Exklusiv-ODER (XOR) n foreach (Werte als Wert) Ergebniswert Test printf (Format. Ergebnis. Wert.. Test) gt das oben gezeigte Beispiel erzeugt folgende Ausgabe: Beispiel 2 bitweise XOR-Operationen auf Strings ltphp 12 9 // Ausgabe 5 echo 12 9 // Gibt die Rück Zeichen (ASCII 8) // (1 (ascii 49)) (9 (ascii 57)) echo 8 echo hallo hallo // Gibt die ASCII-Werte 0 4 0 0 0 // ae 4 echo 2 3 // Ausgänge 1 // 2 ((int) 3) 1 echo 2 3 // Ausgänge 1 // ((int) 2 ) 3 1 gt Beispiel 3 Bit auf ganze Zahlen Verschiebung ltphp die Beispiele Hier sind /. / Echo n --- BIT SHIFT RIGHT ON positiven ganzen Zahlen --- n val 4 Plätze 1 res val gtgt Plätze p (res. Val. Gtgt. Orte. Kopie des Vorzeichenbits in die linke Seite verschoben) val 4 Plätze 2 res val gtgt p Orte (res. val. gtgt. Plätze) val 4 Plätze 3 res val gtgt Plätze p (res. val. gtgt. Orte. Bits verschieben out rechte Seite) val 4 Plätze 4 res val gtgt Plätze p (res. val. gtgt .. n --- BIT SHIFT RIGHT ON negativen ganzen Zahlen --- n val Orte gleiche Ergebnis wie oben nicht über 0) verschieben echo -.... 4 Plätze 1 res val gtgt Orte p (res val gtgt Orte Kopie von Zeichen Bit verschoben in die linke Seite) val -.... 4 Plätze 2 res val gtgt Orte p (res val gtgt Orte Bits verschieben out rechte Seite) val -... 4 Plätze 3 res val gtgt Plätze p (res val gtgt Orte. gleiche Ergebnis wie oben nicht verschieben jenseits -1) echo n --- BIT SHIFT LEFT ON positiven ganzen Zahlen --- n val 4 Plätze 1 res val LTLT Plätze p (res. val. LTLT. Orte. Nullen auf der rechten Seite ausfüllen) val 4 Plätze (PHPINTSIZE 8) - 4 res val LTLT Plätze p (res. val. LTLT. Plätze) val 4 Plätze (PHPINTSIZE 8) - 3 res val LTLT Plätze p (res val LTLT Orte Vorzeichenbits erhalten verschoben out) val 4 Plätze (PHPINTSIZE 8) -..... 2 res val LTLT Plätze p (res val. .. LTLT Orte Bits verschieben out linke Seite) echo n --- BIT SHIFT LEFT ON negativen ganzen Zahlen --- n val - 4 Plätze 1 res val LTLT Plätze p (res val LTLT Orte Nullen auf der rechten Seite ausfüllen).... Val - 4 Plätze (PHPINTSIZE 8) - 3 res val ltlt Plätze p (res. Wert ltlt. Plätze) val - 4 Plätze (PHPINTSIZE 8) - 2 res val ltlt Plätze p (res Linke Seite, einschließlich Vorzeichen-Bit) / Ignorieren Sie diesen unteren Abschnitt, es ist nur Formatierung, um die Ausgabe klarer. / Funktion p (res. Wert op. Orte beachten) Format 0 (PHPINTSIZE 8). Bn printf (Ausdruck: dds dn. Res. Wert op. Stellen) echo Dezimal: n printf (valdn. Val) printf (resdn. Res) echo Binär: n printf (Wertformat. BITWISE-FLAGS für benutzerdefinierte PHP-Objekte Manchmal benötige ich ein benutzerdefiniertes PHP-Objekt, das mehrere boolesche TRUE - oder FALSE-Werte enthält. Ich könnte leicht eine Variable für jeden von ihnen, aber wie immer, Code hat einen Weg, um unweildy ziemlich schnell. Ein intelligenterer Ansatz scheint immer die Antwort zu sein, auch wenn er zunächst übertrieben zu sein scheint. Ich beginne mit einer abstrakten Basisklasse, die eine einzige Integer-Variable namens Flags halten wird. Diese einfache Ganzzahl kann 32 TRUE oder FALSE boolesche Werte enthalten. Eine andere Sache zu berücksichtigen ist, nur bestimmte BIT-Werte setzen, ohne die anderen BITS stören - so in die Klassendefinition enthalten ist die setFlag (Flag, Wert) - Funktion, die nur das ausgewählte Bit gesetzt wird. Heres die abstrakte Basisklassendefinition: Abstrakte Klasse BitwiseFlag-geschützte Flags / Anmerkung: diese Funktionen werden geschützt, um zu verhindern, dass externer Code fälschlicherweise die BITS-Einstellung feststellt. Sehen Sie, wie die erweiterte Klasse Benutzer das verarbeitet. / Geschützte Funktion isFlagSet (Flag) return ((this - gt Flags amp flag) flag) protected function setFlag (Flag-Wert) if (value) this - gt Flags flag sonst this - gt flags amp Die Klasse oben ist abstrakt und kann nicht sein Instanziiert, so dass eine Erweiterung erforderlich ist. Unten ist eine einfache Erweiterung namens User - die stark abgeschnitten ist für Klarheit. Ich bin definieren const Variablen und Methoden, um sie zu benutzen. class User erweitert BitwiseFlag const FLAGREGISTERED 1 // Bit 1 von Flags den Wert 1 const FLAGACTIVE 2 // BIT 2 von Flags hat den Wert 2 const FLAGMEMBER 4 // BIT 3 von Flags den Wert 4 const FLAGADMIN 8 // BIT 4 von Fahnen hat den Wert 8 public function isRegistered () geben diese - gt isFlagSet (Selbst. FLAGREGISTERED) public function isActive () geben diese - gt isFlagSet (Selbst. FLAGACTIVE) public function IsMember () geben diese - gt isFlagSet (Selbst. FLAGMEMBER ) public function isAdmin () geben diese - gt isFlagSet (Selbst. FLAGADMIN) public function setRegistered (Wert) dieser - gt SetFlag (Selbst. FLAGREGISTERED. Wert) public function setActive (Wert) dieser - gt SetFlag (Selbst. FLAGACTIVE. Wert) public function setMember (Wert) dieser - gt SetFlag (Selbst. FLAGMEMBER. Wert) public function setAdmin (Wert) dieser - gt SetFlag (Selbst. FLAGADMIN. Wert) public function toString () return Benutzer. (Dieses - gt ist registriert () REGISTRIERT.). (Dieses - gt istActive () ACTIVE.). (Dieses - gt isMember (). (Dieses - gt isAdmin () ADMIN.). Dies scheint eine Menge Arbeit, aber wir haben viele Probleme, zum Beispiel angesprochen, Verwendung und Wartung der Code ist einfach, und die immer und Einstellung von Flag-Werte sinnvoll. Mit der User-Klasse können Sie nun sehen, wie einfach und intuitiv bitweise Flag Operationen werden. Benutzer neue Benutzer () Benutzer - gt setRegistered (true) Benutzer - gt setActive (true) Benutzer - gt setMember (true) Benutzer - gt setAdmin (true) echo Benutzer // Ausgabe: Benutzer REGISTRIERT aktives Mitglied ADMIN zlel grxnslxves13 bei hotmail dot com Ich verweise auf Eric Swansons Post auf Perl VS PHPs Umsetzung von xor. Eigentlich ist dies kein Problem mit der Implementierung von XOR, aber viel mehr zu tun mit der Lose-Typing-Politik, die PHP adoptiert. Frei Umschalten zwischen int und float ist für die meisten Fälle gut, aber Probleme treten auf, wenn Ihr Wert nahe der Wortgröße Ihrer Maschine ist. Was zu sagen ist, werden 32-Bit-Maschinen Probleme mit Werten auftreten, die um 0x80000000 schweben - in erster Linie, weil PHP nicht ganze Zahlen ohne Vorzeichen unterstützen. mit bindec / decbin würde mit dieser Frage befassen, wie ein Work-around unsigned int xor, aber heres das wirkliche Bild (im nicht behaupten, dass dieser Code ausführen wird besser, aber das wäre eine bessere pädagogische Code sein) zu tun: function unsignedxor32 (a b.) a1 einen Verstärker a2 0x7FFF0000 einen Verstärker 0x0000FFFF a3 einen Verstärker 0x80000000 amp b1 b 0x7FFF0000 b2 b amp 0x0000FFFF b3 b amp 0x80000000 c (a3 b3). 0x80000000. 0 return ((a1 b1) (a2 b2)) cx 3851235679 y 43814 ltbrgtThis Echo ist der Wert, den wir wollen Echo ltbrgt3851262585 Echo ltbrgtThe Ergebnis eines nativen xor-Operation auf ganzzahlige Werte als Ganzzahl mit Vorzeichen Echo ltbrgt behandelt. (Xy) echo ltbrgtWe Daher führen Sie die MSB getrennt echo ltbrgt. unsignedxor32 (. x y) Das ist wirklich Fundament Sachen, aber für diejenigen, die dies in der Schule verpasst haben, scheint es etwas auf 2s, hier zu sein ergänzen: greenone - nette Funktion, danke. Ive angepasst es für Schlüsselverwendung: ltphp Funktion BITXOR (str Taste.) XorWidth PHPINTSIZE 8 // Split o1 strsplit o2 strsplit (strpad (strlen (str), key), xorWidth.) Res läuft count (o1) (str xorWidth.) Für (i 0 i lt Läufe i) res. decbin (bindec (o1 i) bindec (o2 i)) return res gt sagen. Sie wirklich sagen wollen. Mehr als 31 Bits verfügbar für Sie in Ihrem glücklichen bitmask. Und du willst nicht Schwimmer verwenden. So würde eine Lösung, die ein Array von Bitmasken zu haben, die durch eine Art von Schnittstelle zugegriffen wird. Hier ist meine Lösung dafür: Eine Klasse ein Array von ganzen Zahlen zu speichern, die Bitmasken zu sein. Es kann bis zu 66571993087 Bits halten, und befreit ungenutzt Bitmasken, wenn es keine Bits werden in ihnen gespeichert. Ltphp / Infinite Bits und Bit-Handling im Allgemeinen. Nicht unendlich, sorry. Wahrscheinlich wäre die einzige Grenze für die Bitmaskenklasse bei der Speicherung von Bits die maximale Grenze der Indexnummer auf 32-Bit-Ganzzahl-Systemen 231-1, also 231 31 - 1 66571993087 Bits, vorausgesetzt, daß Schwimmer 64 Bit oder etwas sind. Ich bin sicher, dass genug genug Bits für alles. Ich hoffte. / DEFINE (INTEGERLENGTH. 31) // Dummes unterschriebenes Bit. (Bit / INTEGERLENGTH) Bit (int) fmod (Bit INTEGERLENGTH) this - gt Bitmaskenschlüssel 1 ltlt Bit public function remove (bit ) // Bit-Schlüssel (int) (bit / INTEGERLENGTH) Bit (int) fmod (Bit INTEGERLENGTH) diese - gt Bitmaske Schlüssel Amp (1 ltlt Bit) wenn (dieser - gt Bitmaske Schlüssel) (Bit / INTEGERLENGTH) Bit (int) fmod (Bit INTEGERLENGTH) dieser - gt Bitmask Schlüssel 1 ltlt Bit if (dieser - gt Bitmaske Schlüssel) unset ( (Bit / INTEGERLENGTH) Bit (int) fmod (Bit INTEGERLENGTH) gibt diese - gt Bitmaske Key Amp (1 ltlt Bit) öffentliche Funktion zurück Stringin (string) // Lesen Sie einen String von Bits, der bis zu der maximalen Anzahl von Bits lang sein kann. This - gt bitmask array () strsplit (strrev (string), INTEGERLENGTH) foreach (array als Schlüssel gt-Wert) if (Wert bindec (strrev (Wert))) Diese - gt Bitmaske Schlüssel Wert public function stringout () // Drucken (This - gt bitmask) sort (Schlüssel SORTNUMERIC) für (i arraypop (Schlüssel) i gt 0 i -) if (this - gt bitmask i) Zeichenfolge. Sprintf (0. INTEGERLENGTH b. This - gt bitmask i) return string public function clear () // Diese - gt bitmask array () public function debug () // Was ist los in deinem bitmask array vardump (this - Gt bitmask) gt Es behandelt einen positiven Integer-Eingang als Bit, so dass Sie nicht mit den Kräften von 2 selbst befassen müssen. Ltphp bitmask-bit (8979879) // Unabhängig von bitmask - gt set (888) if (bitmask - gt read (888)) drucken Happyn bitmask - gt umschalten (39393) // Yadda yadda bitmask - gt entfernen (888) bitmask - gt debug () bitmask - gt stringin (100101000101001000101010010101010 00000001000001) drucken Sie bitmask - gt stringout () aus. N bitmask - gt debug () bitmask - gt löschen () bitmask - gt debug () gt Anfangs fand ich Bitmasken ein verwirrendes Konzept und fand keine Verwendung für sie. So peitschte Ive diesen Code-Schnipsel, falls sich jemand verwirrt ist: // Die verschiedenen Details ein Fahrzeug hasFourWheels 1 hasTwoWheels 2 hasDoors 4 hasRedColour 8 Fahrrad hasTwoWheels golfBuggy hasFourWheels ford hasFourWheels hasDoors ferrari hasFourWheels hasDoors hasRedColour isBike hasFourWheels amp Fahrrad falsch, weil Fahrrad haben kann Doenst haben vier Räder isGolfBuggy hasFourWheels amp golfBuggy wahr, weil golfBuggy vier Räder isFord hasFourWheels amp ford Wahr hat, weil ford hasFourWheels Und Sie dies auf eine Menge Dinge anwenden können, zum Beispiel Sicherheit: // Sicherheitsberechtigungen: writePost 1 readPost 2 deletePost 4 addUser 8 deleteUser 16 // Benutzergruppen: Administrator writePost readPosts deletePosts addUser deleteUser Moderator readPost deletePost deleteUser Schriftsteller writePost readPost Gast readPost // Funktion für die Erlaubnis Funktion checkpermission zu überprüfen (Benutzerberechtigung.) if (Benutzer amp Erlaubnis) return true sonst false zurück // Jetzt wenden wir all dies an, wenn (checkPermission (Administrator. deleteUser)) deleteUser (Einige Benutzer) Dies wird ausgeführt, weil Administrator kann deleteUser Sobald Sie Ihren Kopf bekommen um ihn herum, die sehr nützlich Denken Sie daran, jeden Wert durch die Kraft der zwei zu erhöhen Probleme mehr zu vermeiden, verweist dies für mich als alles andere. wenn Sie durch alle möglichen binären Kombination zu iterieren, wobei n Anzahl von Flags zu 1 in einer Maske von Bits Länge festgelegt sind: ltphp Echo masksOf (3. 10) Funktion masksOf (n. Bits) u pow (2 Bits) - 1 // Startwert, volle Flaggen ein. Masken-Array (), während (u gt 0) z numflags (u) if (zn) arraypush (Masken u.) u - Return (Masken) Funktion numflags (n) k 0, während (n) kn amp 1 nn gtgt 1 return (K) Hier ist ein Beispiel für bitweises leftrotate und rightrotate. Beachten Sie, dass diese Funktion nur mit Dezimalzahlen funktioniert - andere Typen können mit pack () konvertiert werden. Funktion drehen (dezimal. Bits) binäre decbin (dezimal) return (bindec (substr (binär. Bits). substr (binär. 0. Bits))) // Drehen 124 (1111100) auf die linke Seite mit 1 Bits drehen Echo (124 . 1) // Drehen 124 (1.111.100) nach rechts mit 3 Bits echo drehen (124 - 3) In Bezug auf was Bob sagte über Flaggen, Id gerne darauf hin, theres eine 100 sichere Weise Flags zu definieren, die hexadezimale Schreibweise verwendet Für ganze Zahlen: ltphp define (f0. 0x1) // 20 define (f1. 0x2) // 21 define (f2. 0x4) // 22 define (f3. 0x8) // 23 define (f4 .0x10) // 24 definieren (F5 0x20) // 25 //. Define (f20. 0x1000000) // 220 definieren (f21. 0x2000000) // 221 definieren (f22. 0x4000000) // 222 definieren (f23. 0x8000000) // 223 definieren (f24. 0x10000000) // 224 //. Bis zu 231 gt Ich immer vermeiden, mit Dezimal-Notation, wenn ich eine große Menge von verschiedenen Flaggen haben, weil seine sehr einfach zu falsch Zahlen wie 220 (1048576). Es ist wahr, dass, wenn sowohl der linke als auch der rechte Parameter Strings sind, der bitweise Operator auf den Zeichen-ASCII-Werten arbeitet. Allerdings ist eine Ergänzung notwendig, um diesen Satz zu vervollständigen. Es ist nicht irrelevant, darauf hinzuweisen, dass der Dezimalzeichen-ASCII-Wert unterschiedliche Binärwerte aufweist. Ltphp if ((18 amp 32) 10) echo ord (18) // return decimal value 49, die einen binären Wert haben 110001 echo ord (32) // return decimal value 51, die einen binären Wert haben 110011 echo ord (10) / / Return 49 dezimal-Wert, der 110001 binären Wert haben // Deshalb 110.001 Ampere 110011 110001 gt beachten Sie, dass die Shift-Operatoren Arithmetik, Logik nicht wie in C kann es zu unerwarteten Ergebnissen mit negativen Zahlen, siehe en. wikipedia. org/wiki / Bitweise Operation heres eine Funktion, um logische Rechtsverschiebungen zu tun. Funktion lshiftright (var. amt) Maske 0x40000000 if (var lt 0) var amp 0x7FFFFFFF mask gtgt (amt - 1).. return (var gtgt amt) Maske Rückkehr var gtgt amt printf (arithmetische Verschiebung auf einem negativen integerltbrgt1032bltbrgt2032bltbrgt10dltbrgt20dltbrgt val val gtgt (... die Schaltlogik auf einem negativen integerltbrgt1032bltbrgt2032bltbrgt10dltbrgt20dltbrgt val lshiftright (val 1) 1) printf) printf (.. die Schaltlogik auf einem positiven integerltbrgt1032bltbrgt2032bltbrgt10dltbrgt20dltbrgt, - val lshiftright (- val 1)) gt ergibt die Ausgabe: arithmetische Verschiebung auf einen negativen integer 11111111111111111111111111110110 11111111111111111111111111111011 -10 -5 Logik Verschiebung auf eine negative ganze Zahl 11111111111111111111111111110110 01111111111111111111111111111011 -10 2147483643 Logik Verschiebung auf eine positive ganze Zahl 00000000000000000000000000001010 00000000000000000000000000000101 10 5 Dont die führenden Nullen vergessen. Es ist sehr wichtig, wenn Sie eine ähnliche Funktion wie die Montageanleitung ror und rol (Drehen auf der rechten und Drehen auf links) schreiben wollen, weil der DWORD-Wert Drehen der binäre 32 Positionen immer dauert und umfasst die führenden Nullen So dies der richtige Weg ist, : (. dezimal Bit) Funktion drehen binär decbin (dezimal) binär strpad (. binär 32. 0. STRPADLEFT) return (... bindec (substr (binäre Bits) substr (binäre 0-Bits))) an diesem Assembler-Code suchen : mov edx, 1bf5616c ror edx, 8 nach dieser Operation: edx 0x6c1bf561 (binär: 1101100000110111111010101100001) Aber Ihr Code gibt 0x0d9bf561 (binär: 1101100110111111010101100001) um den richtigen Wert, den Sie durch das hinzufügen dieser Linie mit strpad die führenden Nullen hinzufügen müssen erhalten () (siehe oben). Sehr wichtiges Beispiel für Funktion bitweise Operationen zur Umwandlung von hexadezimalen Farb mit der Funktion hex2rgb (hex) Dezember hexdec (hexcolor) // Hexstring Dezimalwert r Dezember amp hexdec (FF0000) (in der Regel als 6 hexadezimale Ziffernfolge, in getrennte RGB ganzen Zahlen angegeben) // Maske für rot g dec amp hexdec (00FF00) // Maske für grün b dec amp hexdec (0000FF) // Maske für blaues Rückkehrarray (r gtgt 16. g gtgt 8. b) // Shift voll rechts jede Farbe aus Seine ursprüngliche Position gt ltphp rgb hex2rgb (112233) echo red:. Rgb 0. N echo grün:. Rgb 1. N echo blau:. Rgb 2. N gt rot: 17 grün: 34 blau: 51 Seit: dechex (17) 11 dechex (34) 22 dechex (51) 33 Wenn Sie, wie ich, nie darüber nachgedacht haben, wie PHP mit Binär behandelt, kann die Ausgabe des bitweisen NICHT Verwirren Sie. Zum Beispiel: echo Bin:. Decbin (bin). Bin:. Decbin (Notbin). N Bin: 10 bin: 1111111111111111111111111111111111111111111111111111111111111101 Der Grund dafür ist, dass alle Binärzahlen als 32 Bits behandelt werden, auch wenn Sie manuell weniger eingetragen. Um das Ergebnis zu erhalten (01), war es notwendig, und das Ergebnis mit der Anzahl der Bits ich wollte: in diesem Fall 2 (die Zahl 3, in Dezimal). Beachten Sie, dass alle Rückgabewerte Nullen von links entfernt werden, bis sie ein Bit erreichen, das auf 1 gesetzt ist. Fortsetzung des obigen Beispiels: bin amp 3 echo bin amp 3:. Decbin (notbin2). N Beachten Sie, dass der tatsächliche Wert eine Folge von 31 Nullen war, gefolgt von einer 1, aber die Nullen wurden nicht angezeigt. Das ist wohl eine gute Sache. Darüber hinaus verwendet der NICHT-Operator zwei Komplement, was bedeutet, dass die Zahl, die Sie erhalten, sogar fremder sein kann, als Sie erwarten: unter Verwendung von twos Komplement bedeutet, dass 2 -3. Es gibt viele gute Erklärungen von twos Ergänzung online, so werde ich nicht gehen in diese Frage hier. Wenn das, was Sie wollen, nur ohne jede Interpretation eine Folge von Bits umkehren, können Sie eine Funktion wie folgt verwendet werden: Es braucht eine binäre Zeichenkette beliebiger Länge, kehrt die Bits, und gibt den neuen String. Sie können es dann als binäre Zahl behandeln, verwenden Sie bindec (), um es in eine Dezimalzahl umzuwandeln, oder was auch immer Sie wollen. Ich hoffe, dies hilft jemand so viel wie es hätte mir geholfen, vor einer Woche fand ich die 31-Bit-Begrenzung auf die bitweise und ein wenig frustrierend in groß angelegten Berechtigungskontrolle Anwendungen. Ich habe eine Situation mit Seitenebene Zugriff mit mehr als 50 Seiten. Ich war in der Lage, die Begrenzung umgehen, indem Sie eine Schleife hinzufügen, die 31 Bit abgesetzt von rechts, bis das Bit Resource Identifier innerhalb der ersten 31 ltphp Userlevel Sitzung - gt Userlevel ist - 0 die Subtraktion Typ int pgcode pow gewährleistet (2, (pgid - 1)), während (pgcode gt 2147483648) pgcode pgcode / pow (2. 31) Benutzerlevel Sitzung - gt Userlevel / pow (2. 31) if ((Userlevel - 0 amp pgcode)), wenn nicht berechtigt ist, zeigen die nicht autorisierte Seitenkopf (Ort: Unerlaubte) Ausfahrt gt // Teil eines binären Daten extrahieren - aufgrund von Windows Systemgrenzen (und dieser Code), extrahiert Länge Bit (firstbit enthalten LastBit) ist begrenzt auf 31 Bit Funktion subbindata (mybindata firstbit 7. LastBit. 0. highestbitfirst true) // 1. eine Bit-Maske der richtigen Größe erstellen von links triming und rechts // 2. wählen Bits durch eine uND auf mybindata // 3. Verschiebung nach rechts nur Länge erforderlich, wenn (highestbitfirst) Rückkehr zu erhalten ( ((0x7FFFFFFF gtgt (30 LastBit - firstbit)) LTLT (LastBit)) amp mybindata) gtgt (LastBit) else return (((0x7FFFFFFF gtgt (30 - LastBit firstbit)) LTLT (30 - LastBit)) amp mybindata) gtgt (30 - LastBit) Herere meine 32-Bit-Carry-Verwerfen Operationen für die von Ihnen Portierung Verschlüsselungsalgorithmen von C. Seien Sie gewarnt, dass einige von ihnen sind nicht sehr effizient im Vergleich zu den nativen Operationen, vor allem, wenn sie von Heavy-Duty-Verschlüsselungsalgorithmen genannt - aber nicht Verwerfen des Übertrag-Bit kann nicht landen Sie die gleichen Ergebnisse erhalten Sie in C, nur weil PHPs bitweise Operationen wurden nicht für die Arbeit auf festen Größe Registern. (Wenn Ihr portiert Verschlüsselung algo Sie immer noch die gleichen Ergebnisse doent geben, denken Sie daran, Byte-Reihenfolge zu prüfen) Funktion BFSHR32 (x, Bits) if (bits0) return x if (bits32) return 0 y (x amp 0x7FFFFFFF) gtgt Bits, wenn (0x80000000 amp x) y (1ltlt (31 Bits)) Rückkehr y Funktion BFSHL32 (x, Bits) if (bits0) Rückkehr x if (bits32) Rückkehr 0 mask (1ltlt (32-bit)) - 1 return ((x amp Maske) LTLT Bits) amp 0xFFFFFFFF Funktion BFGETBYTE (x, y) return BFSHR32 (x, 8 y) amp 0xFF Funktion BFOR32 (x, y) return (xy) amp 0xFFFFFFFF Funktion BFADD32 (x, y) xx amp 0xFFFFFFFF yy amp 0xFFFFFFFF gesamt 0 Trag 0 für (i0 ilt4 i) Bytex BFGETBYTE (x, i) bytey BFGETBYTE (y, i) Summe Bytex bytey Ergebnis Summe amp 0xFF Vortrages BFSHR32 (Summe, 8) Summenergebnis carry Ergebnis Summe amp 0xFF carry Vortrag BFSHR32 ( Summe, 8) Insgesamt BFOR32 (BFSHL32 (Ergebnis, i8), insgesamt) Hoffentlich kann dies helfen, jemand verstehen, den Spaß der Bitwise Operatoren. Der Zweck dieser Funktion ist es, ein Wert aus der GPC (Get, Post und Cookie) und einige grundlegende Formatierungen, um es je nach VALIDATION Wert zurückgeben: function RETURNSUBMITTEDVALUE (.. VARIABLE Methodenvalidierung) if (POST-Methode) if (isset (POST VARIABLE)) POST Variabler Wert POST VARIABLE elseif (METHODE COOKIE) if (isset (Cookie-Variable)) PLÄTZCHENVariablenWert Cookie-Variable else if (isset (GET VARIABLE)) GET VARIABLE Variablenwert erhalten, wenn (iniget (magicquotesgpc) true) VALUE strip (VALUE) if ((VALIDATION amp 8) 8) VALUE (int) VALUE if ((VALIDATION amp 4) 4) VALUE strtolower (VALUE) if ((VALIDATION amp 2) 2) VALUE strip~~POS=TRUNC (VALUE) if (( VALIDATION Verstärker 1) 1) VALUE Trimm (VALUE) echo RETURNSUBMITTEDVALUE (ID. GET. 8). Ltbr / gt // In ein Integer-Echo RETURNSUBMITTEDVALUE (NAME GET. 3) umwandeln. Ltbr / gt // Trim Whitespace und Strip HTML-Tags echo RETURNSUBMITTEDVALUE (GENDER, GET. 6). LTBR / gt // Streifen HTML-Tags und Bekehrtfall Für diejenigen zu senken, die binäre nicht verstehen, sind die Zahlen, die Sie sehen nicht zufällig, sie verdoppeln jedes Mal (1, 2, 4, 8, 16, 32, 64, 128, 256 , 512, 1024.), die Ihnen erlaubt, die unterschiedliche Funktion zu mischen und anzupassen, zB. 1 2 3 (Trim Whitespace Strip HTML) 2 4 6 (Strip-HTML-Convert in Kleinbuchstaben) Hier ist eine einfache Möglichkeit, bitweise Operation für Flag-Funktionalität verwenden. Damit meine ich eine Reihe von Optionen, die unter die entweder ON oder OFF sein kann, wo keine oder mehrere dieser Optionen eingestellt werden kann, und jede Option kann nur einmal festgelegt werden. (Wenn Sie mit MySQL vertraut sind, denken Set-Datentyp). Hinweis: Für ältere Programmierer ist dies offensichtlich. Hier ist der Code: ltphp Funktion setbitflag (/ variabler Länge args /) val 0 foreach (funcgetargs () als Flag) val val Flagge Rückkehr val Funktion isbitflagset (. Val-Flag) return ((val amp Fahne) flag) // definieren Ihre Fahnen definieren (MYFLAGONE 1.) // 0001 definieren // 0010 definieren // 0100 definieren (MYFLAGFOUR 8.) // 1000 gt ich sollte (MYFLAGTWO 2.) (MYFLAGTHREE. 4): Ihre Fahnen in einem gespeichert werden Einzigen Integer. Sie können Lasten von Merkern in einer einzelnen Ganzzahl speichern. Um meine Funktionen zu verwenden, sagen Sie MYFLAGONE und MYFLAGTHREE setzen wollten, würden Sie verwenden: (. MYFLAGONE MYFLAGTHREE) ltphp myflags setbitflags gt Hinweis: Sie können passieren setbitflags () so viele Flags zu setzen, wie Sie wollen. Wenn Sie später testen möchten, ob ein bestimmtes Flag gesetzt ist, verwenden Sie z. B. ltphp if (isbitflagset (myflags. MYFLAGTWO)) echo MYFLAGTWO ist gesetzt gt Der einzige trickreiche Teil ist die Definition Ihrer Flags. Hier ist der Prozess: 1. Schreiben Sie eine Liste Ihrer Flaggen 2. Zählen Sie sie 3. Definieren Sie das letzte Flag in Ihrer Liste als 1 mal 2, um die Macht der ltcountgt minus eins. (I. E. 12 (ltcountgt-1)) 3. Arbeiten Sie rückwärts durch Ihre Liste, vom letzten zum ersten, definieren Sie jeden als die Hälfte des vorherigen. Sie sollten 1 erreichen, wenn Sie zum ersten bekommen Wenn Sie Binärzahlen, Bits und bitweise Operation besser, die Wikipedia-Seite erklärt es auch wollen verstehen - en. wikipedia. org/wiki/Bitwiseoperation. Okay, Im zwölf, und ich bin neu in PHP, aber ich erstellt die folgenden - simple - Funktionen: ltphp Funktion Isdec (num) if (round (num) num) return false sonst return true Funktion decshiftl (. Nummer Menge), wenn ( Isdec (Zahl)) dezimal substr (Nummer (strlen (Nummer) -. Runde (Anzahl) 1)) dezimal pow (10. strlen (dezimal) - 1) Shiftl (Anzahl LTLT Betrag) ((dezimal LTLT Menge) / pow ( 10. strlen (dezimal))) sonst Shiftl Nummer LTLT Menge Shiftl zurückgeben Funktion decshiftr (Zahl Betrag) if (Isdec (Zahl)) dezimal substr (Nummer (strlen (Nummer..) - Runde (Anzahl) 1)) dezimal pow ( 10. strlen (dezimal) - 1) SHIFTR (Anzahl gtgt Betrag) ((dezimal gtgt Menge) / pow (10. strlen (dezimal))) sonst SHIFTR Nummer gtgt Menge Rückkehr SHIFTR gt Wie dem auch sei, es ist nur schiebend Parameter in einer Gleichung , Aber manchmal neu erfinden das Rad und Putting Raketen auf sie ist eine gute Sache. Es gibt diesen nützlichen bitweisen Rechner für uns, um schnelle Berechnungen durchzuführen: www. bitwiseoperatorcalculator7.8 Shiftoperatoren Der ltlt-Operator verschiebt x links um eine Anzahl von Bits, die wie unten beschrieben berechnet werden. Die höherwertigen Bits außerhalb des Bereichs des Ergebnistyps von x werden verworfen, die verbleibenden Bits werden nach links verschoben und die niedrigwertigen leeren Bitpositionen werden auf Null gesetzt. Der gtgt-Operator verschiebt x rechts um eine Anzahl von Bits, die wie unten beschrieben berechnet werden. Wenn x vom Typ int oder long ist. Werden die niederwertigen Bits von x verworfen, die verbleibenden Bits werden nach rechts verschoben, und die Positionen höherer leerer Bits werden auf null gesetzt, wenn x nicht negativ ist und auf eins gesetzt wird, wenn x negativ ist. Wenn x vom Typ uint oder ulong ist. Werden die niederwertigen Bits von x verworfen, die verbleibenden Bits werden nach rechts verschoben und die Positionen höherer leerer Bits werden auf Null gesetzt. Für die vordefinierten Operatoren wird die Anzahl der zu verschiebenden Bits wie folgt berechnet: Wenn die Art von x int oder uint ist. Wird die Verschiebungszählung durch die niederwertigen fünf Bits der Zählung gegeben. Mit anderen Worten, die Verschiebungszählung wird aus dem Zählerstand 0x1F berechnet. Wenn die Art von x lang oder ulong ist. Wird die Verschiebungszählung durch die niedrigwertigen sechs Bits der Zählung gegeben. Mit anderen Worten, die Verschiebungszählung wird aus dem Zählerverstärker 0x3F berechnet. Wenn die resultierende Verschiebungszahl Null ist, geben die Schiebeoperatoren einfach den Wert von x zurück. Verschiebungsoperationen führen nie zu Überläufen und erzeugen die gleichen Ergebnisse in kontrollierten und ungeprüften Kontexten. Wenn der linke Operand des gtgt-Operators einen signierten integralen Typ hat, führt der Operator eine arithmetische Verschiebung rechts durch, wobei der Wert des höchstwertigen Bits (das Vorzeichenbit) des Operanden an die leerste Bitstellen hoher Ordnung übertragen wird. Wenn der linke Operand des gtgt-Operators ein vorzeichenloser integraler Typ ist, führt der Operator eine logische Verschiebung rechts durch, wobei die Positionen höherer leerer Bits immer auf Null gesetzt werden. Um die entgegengesetzte Operation des vom Operanden-Typ abgeleiteten Typs durchzuführen, können explizite Gussformen verwendet werden. Wenn zum Beispiel x eine Variable vom Typ int ist. Die Operation unchecked ((int) ((uint) x gtgt y)) führt ein logisches Verschiebungsrecht von x durch. Show: Geerbte ProtectedBinary-Optionen Strategie 8211 Teil 2. Die Mathematik und Logik Puzzle Pieces Der letzte Teil Ihres Binary Options Strategy Puzzle ist optional zu Beginn und völlig logisch, nachdem Sie ein wenig Erfahrung zu gewinnen. Sobald Sie das Timing gemeistert und die Auswahl der richtigen Trades haben Sie einige Handelsgeschichte beginnen zu bauen. Dies sollte über ein Demo-Konto am Anfang und dann mit wenig Geld, wie Sie Fortschritte. Sobald Sie beginnen, mehr Trades rechts als falsch haben Sie Ihre eigenen persönlichen Geschichte Geschichte zu überprüfen, ist dies Ihre Waffe angesammelt. Sie werden nun in der Lage sein, eine mathematische Kante in der Reihenfolge einzuführen, dass sie auf dieser Seite dargestellt werden, wenn Ihre persönlichen Ergebnisse es zulassen. Die erste Kante, die Sie gewinnen können, ist durch Compoundierung Ihre Gewinne, die zweite ist ein geringes Risiko und sehr kalkuliert Martingal. Letzteres ist sehr optional und nur Sie wissen, wenn Sie den Magen und Fähigkeiten für sie im Laufe der Zeit haben. Compounding Profits Anwendung In einer früheren Lektion haben wir bereits über das Konzept der Compoundierung gesprochen, so dass Sie es bereits verstehen sollten. Hier ist die zusammengesetzte Sequenz bis zu einem Maximum von 6 wie zuvor und basierend auf 80 Renditen mit 10 Start-Stakes. Free Compounding Profits Worksheet Hier müssen Sie herausfinden, ob es für Sie basierend auf Ihrer eigenen persönlichen Geschichte ist. Wenn zum Beispiel sieht es aus wie 3 Siege in Folge scheint Ihre maximale häufige Siegesserie zu sein, dann sollten Sie nur die Durchführung einer 3 Handels-Verbindung, dann zurücksetzen oder stoppen für den Tag. Entweder 3, 4 oder 5 Gewinn Streifen können mehr profitabel sein, durch Compounded Stakes vs grundlegenden Einsätze, solange Sie stoppen und zurücksetzen. Let8217s einen Blick auf die Zahlen wieder zu verstehen. 10 Stake mit 80 Auszahlungen Basisproben Ergebnisse Verbundene Stakes Ergebnisse Gewinnen Sie 3 in einer Reihe, dann zurücksetzen Win 4 in Folge, dann zurücksetzen Win 5 in Folge, dann zurücksetzen Win 6 in einer Reihe, dann zurücksetzen Die Zahlen don8217t liegen und alles aus 3 Gewinne nach oben zahlt sich aus mit Compoundierung, aber nur, wenn Sie für den Tag zu stoppen, oder Zurücksetzen auf die anfängliche Einsatzgröße, sobald die Siegesserie abgeschlossen ist. Dies ist sehr wichtig, denn wenn Sie weiterhin Compounding bis ein Verlust dann Compoundierung nur sinnvoll, wenn Ihre Gewinn-Streifen sind 5-6. Gewinnen 5 gefolgt von einem Verlust gewonnen8217t geben Ihnen keinen zusätzlichen Gewinn als wenn Sie didn8217t Verbindung. Es würde nur dem Zweck dienen, Ihnen diese Chance für den sechsten Sieg ohne Konsequenz zu geben, wenn Ihr sechster Handelsverlust. Wenn Ihr sechster Handel verloren, wäre es einfach so, als wenn Sie didn8217t Verbindung überhaupt, so gibt es nichts verloren und nichts gewonnen. Wenn Sie den 6. Sieg Nagel, obwohl Sie eine viel größere Belohnung für Compoundierung erhalten, wie, wenn Sie sich entscheiden, bei der 5. aufeinander folgenden Gewinn zu stoppen, die auch eine signifikant größere Belohnung. Das Diagramm oben zeigt Ihnen, dass, auch wenn Sie bei 3 oder 4 Gewinne in Folge zurücksetzen und der Reset oder Stop für den Tag ist es auch wert. Sie können nur beurteilen, wie weit, um Compoundierung basierend auf Ihren eigenen Ergebnissen oder die Ergebnisse, die Sie bekommen von einem Signal-Anbieter zu nehmen. Wenn Sie nach 3, 4, 5 oder 6 Siegen in Folge stoppen und zurücksetzen, werden dann die komprimierten Einsätze mehr als nur einfache Einsätze bezahlen, ABER NUR, WENN SIE STOPPEN UND RÜCKSETZEN. Die Folgen der Fortsetzung der Verbindung und bekommen einen Verlust vor dem sechsten Sieg müssen berücksichtigt werden, diese nächste Tabelle der Zahlen sagt alles. 10 Einsätze mit 80 Auszahlungen Einsätze Einsätze Ergebnisse Wenn Sie 6 Siege in Folge gewinnen können 2 oder 3 von 5 Tagen / Sessions dann Compoundierung ist die klare Wahl. Ein 6-Gewinn-Gewinn-Streak bezahlt Sie fast 3 mal mehr als mit einem Tag oder Sitzung, wo Sie gewinnen 8 und verlieren 2 in keiner bestimmten Reihenfolge mit grundlegenden Einsätzen. Wenn Sie sich entscheiden, bei 5 zu stoppen, dann Compoundierung zahlt Ihnen noch doppelt, was Sie von einem 8216win 8 und verlieren würde 2 in keiner bestimmten Reihenfolge mit einfachen Stakes8217 Tag. Stoppen bei 4 bekommt man ein wenig mehr und hält bei 3 nicht so viel, wenn im Vergleich zu einem 8216win 8 und verlieren 2 in keiner bestimmten Reihenfolge auf Basis Stakes8217 Tag. Die Realität ist, dass nur Sie die Entscheidung treffen können, wie weit zu nehmen Compoundierung und wenn Sie sogar davon profitieren. Ihre Handelsgeschichte aus Ihrem persönlichen Handel oder Ihre Handelsgeschichte, die Sie über einen Signalanbieter akkumuliert haben, beantwortet die Frage für Sie. Halten Sie diese alle logisch, weil es nur einfache Mathematik ist, verwenden Sie es zu Ihrem Vorteil waren Sie können. Low Risk Martingale Anwendung In einer früheren Lektion haben wir bereits über die Grundlagen eines risikoarmen Martingals gesprochen, so dass Sie es bereits verstehen sollten. Martingale kann sich aus der Hand leicht und sehr hohem Risiko, so muss es nur bis zu 2 Ebenen tief begrenzt werden. Dies ermöglicht Ihnen zu quantifizieren, was ist Ihr maximaler Verlust, so dass Sie dann quantifizieren können, was ist die minimale Menge, die Sie benötigen, um einen Gewinn zu betrachten. Die folgende Tabelle der Zahlen ist ähnlich, was wir schon gesehen haben, aber dieses Mal werden wir 80 Renditen verwenden, um die Compoundierung Daten über passen. Free Binär Optionen Martingale Worksheet Hier Um in Synchronisierung mit dem Compounding Ergebnisse oben wäre nur wirklich auf die 10-Pfahl-Spalte konzentriert. Wenn Sie diese niedrige Martingal-Strategie zu verwenden, dann einen Tag oder Sitzung, die Sie einen Verlust nennen würde, ist 84. Um einen Verlust zu vollenden, müssen Sie 3 in einer Reihe verlieren. Noch einmal Ihre Handelsgeschichte wird Ihnen zeigen, wie häufig es ist für Sie, um eine 3-Trade-Streaming zu bekommen. Es doesn8217t Angelegenheit, wenn Sie sie gelegentlich erhalten, aber es würde Angelegenheit, wenn Sie sie häufig erhielten. Low-Risiko-Martingal ist nicht für Sie, wenn Ihre Handelsgeschichte zeigt Ihnen häufiger 3 Handel verlieren Streifen, einfach und einfach. Sie können dieses Add-on später erneut überprüfen, nachdem Sie das korrigiert haben. Also, wenn 84 ist Ihr Tag oder Session verlieren, dann 84 oder höher ist Ihr gewinnender Tag oder Sitzung. Um 84 mit grundlegenden Einsätzen zu erhalten, benötigen Sie 10.5 Gewinne, also müssen Sie dieses bis 11 Gewinne runden. Das ist 11 Siege in keiner bestimmten Reihenfolge, solange Sie don8217t verlieren 3 in einer Reihe. Die Mathematik nie lügt und nur wie mit Compoundierung nur können Sie beurteilen, über Ihre Handelsgeschichte, wenn eine risikoarme Martingal-Anwendung wird Ihnen langfristig zugute kommen. Compounding mit Martingale Wenn Sie don ¡¯ t verlieren 3 in einer Reihe sehr oft, und Sie erhalten gewinnen Streifen oft genug, sowohl Compoundierung und Martingal können in Harmonie sehr effektiv eingesetzt werden. Ihre Session Verlust basierend auf 10 Start-Stakes und 80 Renditen ist 84. Eine 5 Trade-Siegesserie bekommt man 80 und mit 1 Standard-Martingal gewinnen, dass Ihre Renditen würde 84 überschreiten. Eine 6-Gewinn-Streifen gibt Ihnen viel mehr als 84 und Wenn Sie einen 8216win gewinnen, verlieren, gewinnen, verlieren, win8217 Reihenfolge gehen den ganzen Tag dann wird jeder Sieg noch als 1 Sieg aus der erforderlichen 11 gezählt, die Sie gleich müssen, was Sie als Verlust quantifiziert haben. In der Tat, auch wenn Sie gewinnen 3 in einer Reihe und dann verlieren 1, wird Ihr nächster Sieg noch gezählt werden gegen Ihre 11 martingale gewinnt benötigt, plus erhalten Sie die 1 extra, um es hinzuzufügen, dann setzen Sie Ihre Compoundierung und Martingal zu ihrem Start Punkte. Der wichtigste Punkt ist, dass, wenn Sie begonnen haben Compoundierung und Sie begegnen einem Verlust, ist Ihr nächster Einsatz Betrag nicht ein Martingal von diesem zusammengesetzten Betrag waren Sie an, es ist Ihre erste Ebene tiefe Martingalmenge. Die Compoundierung und die Martingale kümmern sich individuell um zu wiederholen, was gerade gesagt wurde, wird empfohlen, dass Sie die 2 Strategien parallel, aber getrennt laufen. Das bedeutet für Sie, dass Sie 3 Optionen haben, Sie verlieren 3 in einer Reihe, und Sie sind für die Sitzung oder Tag fertig, gewinnen Sie 11 Mal ohne Streifen oder Sie erhalten 5 Siege in Folge plus 1 Martingal. Die letzte Option für die Maximierung Ihrer Gewinn-Tag oder Sitzung ist es, die letzte Option auf 6 in einer Zeile auf der Verbindung zu nehmen, macht dies Ihren Siegertag oder Sitzung 1,5 mal größer als ein verlierender Tag, wenn Sie einen Streifen, und gleich zu verlieren Tag, wenn Sie don8217t. Wenn Sie 3 in einer Reihe 2 Mal aus 5 Tagen oder Sitzungen verlieren, werden Sie immer noch profitieren insgesamt, verlieren 3 in Folge nur 1 Mal aus 5 wird aber viel besser für Ihre Tasche. Es gibt Wochen, in denen Sie don ¡¯ t verlieren 3 in einer Reihe überhaupt und Sie erhalten einige gewinnende Streifen wie eine Kirsche auf der Oberseite Haftungsausschluss: Jede Beratung oder Informationen auf dieser Website ist nur allgemeine Beratung - Es berücksichtigt nicht Ihre persönlichen Umstände, bitte Handeln oder investieren nicht nur auf der Grundlage dieser Informationen. Durch das Betrachten von Material oder Nutzung der Informationen auf dieser Website erklären Sie sich einverstanden, dass es sich hierbei um ein allgemeines Bildungsmaterial handelt und Sie keine Personen oder Organisationen haftbar machen, die für den Verlust oder die Beschädigung verantwortlich sind, die durch den Inhalt oder die allgemeine Beratung von ElectroFX, seinen Mitarbeitern, Mitgliedes und nicht die von TripAdvisor LLC. Futures, Optionen und Devisenhandel haben große potenzielle Belohnungen, aber auch ein großes potenzielles Risiko. Sie müssen sich der Risiken bewusst sein und bereit sein, diese zu akzeptieren, um in die Futures - und Optionsmärkte zu investieren. Dont Handel mit Geld, das Sie nicht leisten können, zu verlieren. Diese Website ist weder eine Aufforderung noch ein Angebot zum Kauf / Verkauf von Futures, Spot Forex, cfds, Optionen oder anderen Finanzprodukten. Es wird nicht vertreten, dass ein Konto ähnliche oder ähnliche Gewinne oder Verluste erzielen wird, wie sie in jedem Material auf dieser Website behandelt werden. Die bisherige Performance eines jeden Handelssystems oder Methodik ist nicht notwendigerweise indikativ für künftige Ergebnisse. Hohe Risiko-Warnung: Forex, Futures und Optionen Handel hat große potenzielle Belohnungen, sondern auch große potenzielle Risiken. Der hohe Grad der Hebelwirkung kann sowohl gegen Sie als auch für Sie arbeiten. Sie müssen sich bewusst sein, die Risiken der Investition in Forex, Futures und Optionen und bereit sein, sie zu akzeptieren, um den Handel auf diesen Märkten. Forex-Handel mit erheblichen Verlustrisiken und ist nicht für alle Anleger geeignet. Bitte handeln Sie nicht mit geliehenem Geld oder Geld, das Sie sich nicht leisten können. Alle Meinungen, Neuigkeiten, Recherchen, Analysen, Preise oder andere Informationen auf dieser Website werden als allgemeine Marktkommentare zur Verfügung gestellt und stellen keine Anlageberatung dar. Wir haften nicht für Verluste oder Schäden, einschließlich, aber nicht beschränkt auf Verluste, die direkt oder indirekt aus der Nutzung oder dem Vertrauen auf diese Informationen entstehen können. Bitte denken Sie daran, dass die bisherige Wertentwicklung eines Handelssystems oder einer Methodologie nicht notwendigerweise auf zukünftige Ergebnisse hindeutet.
No comments:
Post a Comment