ビット演算

左にシフト

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 (2371d)