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

Junya NORIMATSU

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

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

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

皆さんは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) 
============================
This column was published by the author in their personal capacity.
The opinions expressed in this column are the author's own and do not reflect the view of Cafetalk.

Comments (0)

Login to Comment Log in »
Premium ribbon

from:

in:

Categorie insegnate

Language Fluency

Giapponese   Madrelingua
Inglese   Conversazione quotidiana
Coreano   Insufficiente

Le rubriche di Junya NORIMATSU più lette

  • Programming & Development

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

    こんにちは。最近暑いですね。 私が住んでいる関東地方は先日梅雨入りしまして、このコラムを書いている当日は真夏日とかニュースになっていました。 さて、本日はプログラミングの雑学です。 実用性はほぼあ...

    Junya NORIMATSU

    Junya NORIMATSU

    0
    7833
    Jun 10, 2018
  • Computer Graphics

    Pythonでお絵書き

    こんにちは。ついにゴールデンウィークですね。私もゴールデンウィークに浮かれてPythonでお絵書きしてみました。こちらに貼り付けた絵は、マンデルブロ集合という有名な幾何学模様です。もともと数学のお話...

    Junya NORIMATSU

    Junya NORIMATSU

    0
    7759
    Apr 28, 2018
  • Python問題集を作り直しました

    こんにちは。年末くらいから黙々と作っていた問題集がようやく完成しました。昨年夏くらいに軽く作っていたものの反省に基づき一から作り直しました。教科書にしている本はわりと分かりやすいと思うのですが、練習...

    Junya NORIMATSU

    Junya NORIMATSU

    0
    7108
    Jan 19, 2019
  • Programming & Development

    あけましておめでとうございますと今年の計画

    こんにちは。明けましておめでとうございます。お正月休みも終わり、会社や学校がはじまって慌ただしくなりつつありますね。まず、お知らせの方にも書きましたが新しいクーポンを作りましたのでぜひご利用ください...

    Junya NORIMATSU

    Junya NORIMATSU

    0
    6855
    Jan 8, 2019
« Tutte le rubriche

Got a question? Click to Chat