トリッキーなコード

このエントリーをはてなブックマークに追加
a
┌──┐
│┌─┼┐
││  ││
└┼─┘│
  └──┘b

a+b.       |a*b.       |a^b.      
┏━━┓  |┌──┐  |┏━━┓
┃┌─╋┓|│┏━╋┐|┃┏━╋┓
┃│  │┃|│┃  ┃│|┃┃未┃┃a,bの内、重なっていない所を選択
┗╋─┘┃|└╋━┛│|┗╋━┛┃(重なっているところは未選択)
  ┗━━┛|  └──┘|  ┗━━┛
                         ↓こういう状態ね
                    ┏━━━┓
                    ┃llllllllllllllll┃
                    ┃lllll┏━╋━┓
                    ┃lllll┃  ┃lllll┃
                    ┗━╋━┛lllll┃
                        ┃llllllllllllllll┃
                        ┗━━━┛
初期状態

a.       |
┌──┐|
│    │|  ┌──┐
│    │|  │    │
└―─┘|  │    │
        |  └──┘b

a^=b
 : aとbを重ね、aを「a,bの内、重なっていないところを選択したもの」にする。
 : bはそのまま。

a.         |b
┏━━┓  |
┃┏━╋┓|  ┌──┐
┃┃未┃┃|  │    |
┗╋━┛┃|  │    |bは変更無し
  ┗━━┛|  └──┘

b^=a
 : 「変更後のa」とbを重ね、
.   「重なっていないところを選択」したものを改めてbとする。
 : aはそのまま。

a.         |b
┏━━┓  |┌──┐
┃┏━╋┓|│    |
┃┃未┃┃|│    |::::
┗╋━┛┃|└──┘:::: ( bが、「最初のa」の位置に移動した )
  ┗━━┛|   ::::::::::::::

a^=b
 : さらにaとbを重ね、「重なっていないところを選択」したものをaとする。
 : bはそのまま。

a.         |b
::::::::::::::    |┌──┐
: : ┌──┐|│    |
: : │    ||│    |::::
  │    ||└──┘:::: ( aが、「最初のb」の位置に移動した )
  └──┘|   ::::::::::::::