今回わからなかったのは「>>」「~」「&」の3つです。
以下のような式で使われていました。
val >> 4 ~val val & 0xffff
それぞれ意味は以下のようです。
「>>」(右シフト演算)
これは左辺の値を右辺のビット数だけ右にシフトさせます。
符号ビットは保持されます。
ビットを右に1つシフトすると値は1/2になります。2つシフトすると1/4です。
以下の例は1234を右に4つシフトするので1/16になります。
2進数で表現すると以下のようになります。
同じ様な物に、<<(左シフト演算)があります。
こちらは逆に左に1つシフトすると2倍、2つシフトすると4倍です。
「~」(ビット反転)符号ビットは保持されます。
ビットを右に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になります。
2進数で表現すると以下のようになります。
符号付きの2進数のため、-1235になります。
「&」(ビット論理積)1234のビットを反転させると-1235になります。
p ~1234 => -1235
2進数で表現すると以下のようになります。
010011010010 ↓ 101100101101
符号付きの2進数のため、-1235になります。
右辺と左辺のビットの両方が「1」の場合は「1」、片方が「0」の場合は「0」になります。
これはサブネットマスクの計算の時に使ったやつですね。
以下の2進数の表現のようにビット列を上下に並べて上下とも「1」だったら「1」、片方が「0」だったら「0」になるやつです。
2進数で表現すると以下のようになります。
0xffffだとそのままなので分かりにくいかもしれません。
他の例を見てみましょう。
2進数で表現すると以下のように1になります。
これはサブネットマスクの計算の時に使ったやつですね。
以下の2進数の表現のようにビット列を上下に並べて上下とも「1」だったら「1」、片方が「0」だったら「0」になるやつです。
p 1234 & 0xffff => 1234
2進数で表現すると以下のようになります。
0000010011010010 1111111111111111 ------------------ 0000010011010010
0xffffだとそのままなので分かりにくいかもしれません。
他の例を見てみましょう。
p 21 & 11 => 1
2進数で表現すると以下のように1になります。
10101 01011 ------- 00001
以上です。
0 件のコメント:
コメントを投稿