ビット反転と三項演算子
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
と書ける.
こうやってよりコードが見やすくなります?という感じ.