2013年12月20日金曜日

rubyの演算子(>>、~、&)

rubyのソースを見ていてわからない記号があったので調べました。
今回わからなかったのは「>>」「~」「&」の3つです。

以下のような式で使われていました。
val >> 4
~val
val & 0xffff

それぞれ意味は以下のようです。

「>>」(右シフト演算)
これは左辺の値を右辺のビット数だけ右にシフトさせます。
符号ビットは保持されます。
ビットを右に1つシフトすると値は1/2になります。2つシフトすると1/4です。

以下の例は1234を右に4つシフトするので1/16になります。
p 1234 >> 4
=> 77

2進数で表現すると以下のようになります。
010011010010
     ↓
000001001101

同じ様な物に、<<(左シフト演算)があります。
こちらは逆に左に1つシフトすると2倍、2つシフトすると4倍です。

「~」(ビット反転)
ビットの「1」と「0」を反転させます。
1234のビットを反転させると-1235になります。

p ~1234
=> -1235

2進数で表現すると以下のようになります。
010011010010
     ↓
101100101101

符号付きの2進数のため、-1235になります。

「&」(ビット論理積)
右辺と左辺のビットの両方が「1」の場合は「1」、片方が「0」の場合は「0」になります。

これはサブネットマスクの計算の時に使ったやつですね。
以下の2進数の表現のようにビット列を上下に並べて上下とも「1」だったら「1」、片方が「0」だったら「0」になるやつです。

p 1234 & 0xffff
=> 1234

2進数で表現すると以下のようになります。

  0000010011010010
  1111111111111111
------------------
  0000010011010010

0xffffだとそのままなので分かりにくいかもしれません。
他の例を見てみましょう。
p 21 & 11
=> 1

2進数で表現すると以下のように1になります。

  10101
  01011
-------
  00001

以上です。

0 件のコメント:

コメントを投稿