このブログの内容が難しい方へ

もし、内容が難しくて理解出来ない場合には、Cプログラミング入門以前などのプログラミングを始める前に知っておくと良い事が書いてある本を読んでから、その後にやさしいC 第3版 [やさしいシリーズ]などのC言語というプログラミング言語の入門書を読むことをお勧めします。また、MIDIの知識がない人は、コンプリートMIDIブックなどがお勧めです。そこまで理解できれば、KSP特有の作法は、このブログを参考にすれば大丈夫だと思います。

2011年9月2日金曜日

ビット演算子

ビット演算子は、少し難しいです。2進数を理解していないと、ビット演算子を理解するのは難しいです。なので、2進数が苦手な人は、読まなくてもいいです(笑)。では、先にKSPに用意されているビット演算子の表を見てしまいましょう。

x .and. y ビット単位のand
x .or. y ビット単位のor
.not. x ビット単位の否定
sh_left(,) ビット単位での左シフト
sh_right(,) ビット単位での右シフト

では、一つ一つ調べていきましょう。ビット単位のandとは、xとyの値を、ビット単位で比較して、どちらも1であれば1を返し、どちらかが0、もしくはどちらも0であれば0を返します。どういうことかというと、例えば10進数で255とは、2進数にすると1111 1111になります(コンピュータ内では、もっと多くの桁を使っていて、9桁以上の桁は全て0になっています。この桁数が32桁だと32ビット、64桁だと64ビットと言うわけです)。そして、10進数で170は、2進数にすると、1010 1010になります。これをビット単位のandで演算すると、1010 1010の170になるわけです。もう1つ例を出すと、10進数で162(2進数だと1010 0010)と、10進数で10(2進数だと0000 1010)をビット単位のandで演算すると、0000 0010で2になるわけです。つまり、ビット単位の演算とは、2進数で、一桁ずつ演算するという意味です。KSPのプログラムだと以下のようになります。

on init
	declare $X := 162
	declare $Y := 10
	declare $A 
end on

on note
	$A := $X .and. $Y
	message($A)
end on

ビット単位のorとは、少なくともどちらかが1であれば1を返します。170と、85のビット単位のorとは、2進数にすると1010 1010と0101 0101のビット単位のorということなので、1111 1111の255になります。

on init
	declare $X := 170
	declare $Y := 85
	declare $A 
end on

on note
	$A := $X .or. $Y
	message($A)
end on

ビット単位のnotとは、つまり、ビット単位で反転するわけですね。170をビット単位でnot演算すると、1010 1010が0101 0101になるので、85に……なりません(笑)。まずは、以下のコードを見てください。

on init
	declare $X := 170
	declare $A 
end on

on note
	$A := .not. $X
	message($A)
end on

このプログラムを実行すると、ステータスラインには、-171と表示されます。なぜでしょうか?まず、2進数で一番左の桁というのは、1で負の値、0で正の値を意味します。つまり、170を2進数で表すと、一番左の桁は0なのです。この0は.not.で1になりますから、符号が-に変わるわけです。コンピュータ内では、正の値の最大値は一番左の桁が0で、残りの桁が全て1の数です。負の値の最小値は、一番左の桁が1で、残りの桁が全て0の数です(-1は、2進数にすると全ての桁が1になります)。そして、もう1つ、2の補数という概念を理解しないといけません。2の補数とは、ビット単位で全て反転させて、+1をした数です。この辺りの理屈を理解するには、「2の補数」でググッて調べてみてください。 では、次にいきましょう。

on init
	declare $X := 170
	declare $A 
end on

on note
	$A := sh_left($X,2)
	message($A)
end on

左シフトとは、ビット単位で、指定した単位だけ、桁を左にずらします。桁を1つずらせば、数は2倍、2つずらせば4倍、3つずらせば8倍となっていきます。このプログラムの場合は4倍になるので、680がステータスラインに表示されます。逆に右シフトの場合は、1/2、1/4、1/8となっていくわけです。今回は、2進数が理解できていないと、なかなか難しいと思いますので、興味のない方は、全く理解できなくても問題ありません。これでKSPの演算子については終わりです。

0 件のコメント:

コメントを投稿