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

【CommonLisp】ash関数でビット演算

Lisp

完全に趣味の世界でlispを始めた。
というか、Land of Lispを読み始めた(・∀・)


関数一つ調べてもRubyとは対極で日本語の記事は全然でてこない。。
調べたことは逐次ブログに上げといたほうが個人的な資産になりそう(笑)


ash関数は、第一引数の整数を第二引数分だけビット移動する関数。
例えば、第一引数に10を指定して、第二引数に1を指定すれば1ビット左に移動するので、20となる。
まあ1ビット移動すると2倍、2ビット移動すると4倍だ。確か。そうだよね??
逆に、右に移動すると2分の1、4分の1となる。

;左シフト演算
(ash 5 1) ;10

(ash 10 2) ;40

(ash (+ 5 2) 2) ;28

;右シフト演算
(ash 5 -1) ;2

(ash 10 -2) ;2

(ash (+ 5 2) -2) ;1

ash関数は右シフト演算の時に特徴があって、右シフト時にあふれたビットが捨てられるという点。
つまり、11を1ビット右に移動した場合5になるということだ。

3ビットで詳しく見ると、
(2進数)11
右にシフト
(2進数)011
あふれた分を切り捨て
(2進数)01

こういうこと。・・・ではないだろうか。たぶん。