Shammer's Philosophy

My private adversaria

Lispでシフト演算をする

そのままズバリな名前の関数ではなかったのでメモ。ashという関数を使用する。

? (ash 32 5)
1024
? (ash 23 2)
92
? (ash 32 1)
64
? (ash 64 -1)
32
? (ash 32 -5)
1
? (ash 32 -6)
0
? (ash 32 -7)
0
? 

ashは引数を二つ取る。一つはもとになる数(この数に対してシフト演算をするという数)。二つ目は、何ビット分シフトさせるかという数。上記で言えば、32を5ビット分右にシフトさせると1024となっている。32は2の5乗。これを左に5ビットシフトさせればさらに5乗することになり、2の10乗になる。つまり、1024が返されている。右にシフトさせるには、二つ目の引数を負の数にしてやればよい。