{"id":1333,"date":"2012-05-27T10:21:05","date_gmt":"2012-05-27T08:21:05","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1333"},"modified":"2012-06-06T13:18:29","modified_gmt":"2012-06-06T11:18:29","slug":"inselraus-variablen-mit-xor-vertauschen","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2012\/05\/inselraus-variablen-mit-xor-vertauschen\/","title":{"rendered":"Inselraus: Variablen mit Xor vertauschen"},"content":{"rendered":"<p>Eine besonders trickreiche Idee f\u00fcr das Vertauschen von Variableninhalten arbeitet mit dem Xor-Operator und ben\u00f6tigt keine tempor\u00e4re Zwischenvariable. Die Zeilen zum Vertauschen von x und y lauten wie folgt:<\/p>\n<pre>int x = 12, \n  <br \/>&#160;&#160;&#160; y = 49; \n\n  <br \/>x ^= y; \/\/ x = x ^ y = 001100bin ^ 110001bin = 111101bin \n\n  <br \/>y ^= x; \/\/ y = y ^ x = 110001bin ^ 111101bin = 001100bin \n\n  <br \/>x ^= y; \/\/ x = x ^ y = 111101bin ^ 001100bin = 110001bin \n\n  <br \/>System.out.println( x + &quot; &quot; + y );&#160; \/\/ Ausgabe ist: 49 12<\/pre>\n<p>Der Trick funktioniert, da wir mit Xor etwas \u00bbhinein- und herausrechnen\u00ab k\u00f6nnen. Zuerst rechnet die erste Zeile das y in das x. Wenn wir anschlie\u00dfend die Zuweisung an das y machen, dann ist das der letzte schreibende Zugriff auf y, also muss hier schon das vertauschte Ergebnis stehen. Das stimmt auch, denn expandieren wir die zweite Zeile, steht dort: \u00bby ^ x wird zugewiesen an y\u00ab, und dies ist y ^ (x ^ y). Der letzte Ausdruck verk\u00fcrzt sich zu y = x, da aus der Definition des Xor-Operators f\u00fcr einen Wert a hervorgeht: a ^ a = 0. Die Zuweisung h\u00e4tten wir zwar gleich so schreiben k\u00f6nnen, aber dann w\u00e4re der Wert von y verloren gegangen. Der steckt aber noch in x aus der ersten Zuweisung. Betrachten wir daher die letzte Zeile x ^ y: y hat den Startwert von x, doch in x steckt ein Xor-y. Daher ergibt x ^ y den Wert x ^ x ^ y, und der verk\u00fcrzt sich zu y. Demnach haben wir den Inhalt der Variablen vertauscht. Im \u00dcbrigen k\u00f6nnen wir f\u00fcr die drei Xor-Zeilen alternativ schreiben:<\/p>\n<pre>y ^= x ^= y;&#160;&#160; \/\/ Auswertung automatisch y ^= (x ^= y) \n  <br \/>x ^= y;<\/pre>\n<p>Da liegt es doch nahe, die Ausdr\u00fccke weiter abzuk\u00fcrzen zu x ^= y ^= x ^= y. Doch leider ist das falsch (es kommt f\u00fcr x immer null heraus). Motivierten Lesern bleibt dies als Denksportaufgabe \u00fcberlassen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eine besonders trickreiche Idee f\u00fcr das Vertauschen von Variableninhalten arbeitet mit dem Xor-Operator und ben\u00f6tigt keine tempor\u00e4re Zwischenvariable. Die Zeilen zum Vertauschen von x und y lauten wie folgt: int x = 12, &#160;&#160;&#160; y = 49; x ^= y; \/\/ x = x ^ y = 001100bin ^ 110001bin = 111101bin y ^= x; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-1333","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1333","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=1333"}],"version-history":[{"count":2,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1333\/revisions"}],"predecessor-version":[{"id":1355,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1333\/revisions\/1355"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}