petitviolet_blog

@petitviolet blog

ビット反転と三項演算子

FizzBuzz

なんとなくFizzBuzzとかやったり解答例FizzBuzz - Pythonのお勉強を眺めてると

for i in range(100):print i%3/2*"Fizz"+i%5/4*"Buzz"or-~i

というワンライナーを見つけて,

~i

って何だよ,ってなって調べてみた.

ビット演算子

Pythonにはビット演算子としてビット演算子 - 数値 - Python入門にあるように

&, |, ^, ~, <<, >>

の6種類があるらしい.

  • & : and
  • | : or
  • ^ : xor
  • ~ : ビット反転
  • <<, >> : シフト演算子

となっている.
とりあえず上のFizzBuzzでも使われている ~ について.

ビット反転

これはそのまんまの意味.
pythonでは

~i == -(i + 1)

と定義されているらしい.
例えば10進数で3というのは,2進数で表すと0011となる.
従って,3をビット反転させると1100となる.
2の補数表現を思い出すと,最上位ビットが1の時,その値は負であるから
1100は-4となる.
という感じだけど

5(10) ⇒ 0101(2) ⇒ 1010(2) ⇒ -2(10)

となってしまうが,

5(10) ⇒ 00101(2) ⇒ 11010(2) ⇒ -6(10)

とすれば上の定義に合う.
はっきり言ってよく分からないw

  • じゃあ-~iは?

i = ~i
i = -i

と分割され,

i ⇒ -(i + 1) ⇒ i + 1

となる.

print i + 1

の代わりに

-~i

と書くことで文字数を減らすことに成功しているらしい.

三項演算子

例として

from random import randint
i = randint(-10, 10) # iは-10から10の間の値

というiに対して

if i > 0:
    print i
else:
    print 0

これは,

print i > 0 and i or 0

と書ける.
こうやってよりコードが見やすくなります?という感じ.