Deja que el mundo condimente tu vida

Cafetalk Tutor's Column

Tutor Junya NORIMATSU 's Column

明日使えないプログラミングの雑学(Pythonコード付き)

2018-06-10

こんにちは。最近暑いですね。
私が住んでいる関東地方は先日梅雨入りしまして、このコラムを書いている当日は真夏日とかニュースになっていました。

さて、本日はプログラミングの雑学です。
実用性はほぼありませんがコラムだったら大丈夫かなと思って紹介しますね。
(レッスンはちゃんと実用性のある内容にしていますのでご安心ください!!)

本日のテーマは変数入れ替えです。

皆さんは2つの変数の値を入れ替えたいとき、どう書きますか?

そうですね。たとえば、変数aとbに値が入っているとすると、一般的には

tmp = a
a = b
b = tmp

と書きますね。

でも、ここで出現する一次変数tmp、「これ邪魔だなー」とみんな思ってしまいます。
そんな中、値を一次変数を使わずに入れ替える方法を考え出した人がいらっしゃいます。

その人曰く、

a = a ^ b
b = a ^ b
a = a ^ b

で入れ替わるとのこと。(コードに出てきた^はXOR演算子です。)
ぱっと見なんのこっちゃです。

よく考えましょう。aとbのXORはこんな表で表せますね。

a | b | a XOR b
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0

それでは問題です。b ^ bはどうなるでしょう?

はい、かならず0になります。

さて、元のコードをよく見ましょう。
最初の2行を合わせると
b = a ^ b ^ b
ですね。

b ^ bの部分を先に計算すると、
b = a ^ 0 = a
になりまして2行目の時点でbにaが入ります。

3行目行きましょう。
3行目が実行される時点でbに(始めの)aが入っており、aには(始めの)a^bが入っているので、解きほぐすと、
a = (a ^ b) ^ a
ですね。混乱しそうですがイコールの右辺は実行前のaとbの値です。

XORは交換則が成り立つので、
a = (a ^ a) ^ b = b
となって、始めのbの値がaに入ります。
結果的にaとbが入れ替わる訳です。

一応XOR交換アルゴリズムなんて名前がついています。

というわけでPythonでちゃんと書いたコードがこちら。
https://gist.github.com/jnory/44d32dd543fd7fbd29a4e542c98fed34

ただし、Pythonの場合、2変数を入れ替えたいときは
b, a = a, b
で入れ替わりますので本当に使う機会はありません。
こういう書き方ができないC言語などで入れ替えたいときは使い道が…わたしは出会ったことがないですね。
(まれにはあるみたいです。)

興味を持っていただいた方のために参考サイトにリンクしますね。
お疲れさまでした。
【PR】ただいまクーポンをご用意しております。ご利用くださいね。
============================
クーポン名: cafetalk開講3ヶ月目突入クーポン!
コード: 48e71595
割引率: 30%
適用レッスン: あなたもきっと作れる!プログラミング入門〜初級 (Python)
対象受講期間: 2018年6月1日 ~ 2018年6月30日
クーポンのURL: http://cafetalk.com/coupons/detail/?id=734868&lang=ja
(GMT+09:00 Tokyo) 
============================

Got a question? Click to Chat