ビット演算

左にシフト

 say 3<<1; # 6
 say 3<<2; # 12
 say 3<<3; # 24

1ビット、左にシフトすると、数は2倍になる。

右にシフト

 say 24>>1; # 12
 say 24>>2; # 6
 say 24>>3; # 3
 say 24>>4; # 1
 say 3 / 2; # 1.5

1ビット、右にシフトすると、数は半分になる。

あるビット列について、特定のビットだけ取り出す

 my $num = 25;
 my $pos = 3;
 my $bit_mask = 1<<$pos;
 
 printf "%b\n", $num;       # 11001
 printf "%b\n", $bit_mask;  #  1000
 
 say $num & $bit_mask;      # 8
 say 25 & (1<<3);           # 8
  • 特定のビットは1<<nで表せる。これをビットマスクと呼ぶ。
  • あるビット列について、ビットマスクと論理積(&)を取ると、特定のビットを取り出せる。
  • 上の例では、あるビット列(11001/25)の3番目(一番下の桁を0番目とする)のビットを取り出してる。

あるビット列について、特定のビットをセットする

 my $num = 25;
 my $pos = 2;
 my $bit_mask = 1<<$pos;
 
 printf "%b\n", $num;           # 11001
 printf "%b\n", $bit_mask;      #   100
 
 say $num | $bit_mask;          # 29
 say 25 | (1<<2);               # 29
 printf "%b\n", (25 | (1<<2));  # 11101
  • あるビット列について、ビットマスクと論理和(|)を取ると、特定のビットをセットできる。
  • 上の例では、あるビット列(11001/25)の2番目のビットをセットしてる。

あるビット列について、特定のビットをクリアする

 my $num = 25;
 my $pos = 3;
 my $bit_mask = 1<<$pos;
 
 printf "%b\n", $num;           # 11001
 printf "%b\n", ~$bit_mask;     # 11111111111111111111111111110111
 
 say $num & ~$bit_mask;         # 17
 say 25 & ~(1<<3);              # 17
 printf "%b\n", (25 & ~(1<<3)); # 10001
  • あるビット列について、論理否定(~)したビットマスクと論理積(&)を取ると、特定のビットをクリアできる。
  • 上の例では、あるビット列(11001/25)の3番目のビットをクリアしてる。

n進数を10進数に変換

 say oct("011");    # 8進数→10進数 「9」
 say oct("0xA1");   # 16進数→10進数 「161」
 say oct("0b101");  # 2進数→10進数 「5」
 say oct("11");     # 8進数→10進数 「9」

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2012-01-17 (火) 20:14:07