Python のインクリメント!

「Python インクリメント」という検索ワードで来られた方がいるようです。Python には C のようなインクリメント演算子はありません。以下のようにする必要があります。

# a = i++ に相当
a  = i
i += 1

# a = ++i に相当
i += 1
a  = i
# もしくは
a = i = i + 1

蛇足ですが、x + 1 は -~1 と書くことができます (http://www.reddit.com/r/Python/comments/wbs1o/best_way_to_increment_of_1_in_python/)。なんじゃこりゃ!? ~ は 1 の補数を得る演算です。Python は整数を2の補数で表現するので、このようなマジックが可能になります。

-~1 は 1 の各ビットを反転して、それから符号を反転する (2 の補数を得る)、ということです。
整数を 8 ビットで表現して点検しましょう。

1. 1 をビット列で表現します
   0000 0001

2. 反転します ('~' 演算子)
   1111 1110

3. 符号を反転します = 2 の補数を取ります = 1 の補数に 1 を足します ('-' 演算子)
     0000 0001 + 0000 0001
   = 0000 0010

以上で -~1 が 2 になることが分かりました。

今度は -3 をインクリメント、つまり -~-3 を演算してみましょう。

1. -3 をビット列で表現します。3 の 2 の補数ということです
   1111 1101

2. 反転します ('~' 演算子)
   0000 0010

3. 符号を反転します ('-' 演算子)
     1111 1101 + 0000 0001
   = 1111 1110

以上で -~-3 が -2 になることが分かりました。

-~1 みたいな書き方は無意味に見えますが、単項演算子しか出てこないのが面白いですね!

(コウヅ)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中