* ビット演算 [#k75accc0]

** 左にシフト [#e0004c88]
 say 3<<1; # 6
 say 3<<2; # 12
 say 3<<3; # 24
1ビット、左にシフトすると、数は2倍になる。

** 右にシフト [#qff8dff6]
 say 24>>1; # 12
 say 24>>2; # 6
 say 24>>3; # 3
 say 24>>4; # 1
 say 3 / 2; # 1.5
1ビット、右にシフトすると、数は半分になる。

** あるビット列について、特定のビットだけ取り出す [#jb5acbbc]
 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番目とする)のビットを取り出してる。

** あるビット列について、特定のビットをセットする [#k9d4049a]
 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番目のビットをセットしてる。

** あるビット列について、特定のビットをクリアする [#r0714032]
 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進数に変換 [#q7a4efd0]
 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