読者です 読者をやめる 読者になる 読者になる

牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

ビット演算をPythonでやってみた

Python

とあるコード見てたら"~"とか"|"出てきたので少し調べてみた。

CPUからすればビット演算は簡単な論理回路で実現できるが、四則演算、特に乗除算は複雑な論理回路を必要とするため、多くのコンピュータでは、ビット演算は加減算より若干速く、乗除算よりずっと高速である。

http://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97%E5%AD%90
とりあえずやってみる
>>> a = 1
>>> b = 2
>>> c = a | b
>>> c
3
>>> a & b
0
>>> a | b
3
>>> d = 3
>>> c & d
3
>>> b | a
3
>>> 1 + ~1
-1
>>> 2 + ~2
-1
>>> ~0
-1
>>> for i in range(10):
...     print i, ~i, i + ~i
... 
0 -1 -1
1 -2 -1
2 -3 -1
3 -4 -1
4 -5 -1
5 -6 -1
6 -7 -1
7 -8 -1
8 -9 -1
9 -10 -1

どのようなときに"~x"とか使うんだろ?

"+"と"|"の計算速度を実験してみる
import time

def hoge(pattern):
    t1 = time.clock()
    sum = 0

    for i in range(1, 100001):
        if pattern == 1:
            sum = sum + i #hoge(0)
        else:
            sum = sum | i #hoge(1)
    t2 = time.clock()
    return t2 - t1

hoge(0)が"+"の場合、hoge(1)が"|"の場合、

>>> hoge(0)
0.070000000000000284
>>> hoge(0)
0.059999999999999609
>>> hoge(0)
0.070000000000000284
>>> hoge(0)
0.060000000000000497
>>> hoge(0)
0.059999999999999609
>>> 
>>> hoge(1)
0.049999999999999822
>>> hoge(1)
0.049999999999999822
>>> hoge(1)
0.049999999999999822
>>> hoge(1)
0.060000000000000497
>>> hoge(1)
0.049999999999999822

確かに"+"より"|"を使ったものが若干速い。(こういうこと?)



結局、ビット演算てどのような時に使うと便利なの?(´・ω・`)
速く計算したい時とか?