Skip to content

Instantly share code, notes, and snippets.

@tchn
Last active December 19, 2015 00:09
Show Gist options
  • Save tchn/9d95658c37f6d251ed76 to your computer and use it in GitHub Desktop.
Save tchn/9d95658c37f6d251ed76 to your computer and use it in GitHub Desktop.
Cのビット演算系のtips
  • 下位の n ビットの値を取り出す
val & (2**n - 1)
例: 96 の 下位6ビットの値を取り出す
01100000 // 96
00111111 // (2**6)-1 -> 63 (077)

結果: 00100000 // 32
  • 2つの整数が等しいか比較する
( val1 ^ val2 )
例1:
// val1 = 1, val2 = 1 のとき
0001 //val1
0001 //val2

0000 //val1 ^ val2  は0になる

例2:
// val1 = 1, val2 = 2 のとき
0001 //val1
0010 //val2

0011 //val1 ^ val2 は0以外になる
  • ある整数のうちのバイトが、別の整数のバイトと同じであるか調べる
val1 & val2
例1:
// val1 = 0xC0000040, val2 = 0x00000040 のとき (ある整数のうちのバイトが、別の整数のバイトと同じであるとき)
0xC0000040 & 0x00000040

64 //val1 & val2 は 0以外になる

(0xC0000040) 11000000000000000000000001000000
(0x00000040) 00000000000000000000000001000000

例2:
// val1 = 0xC0000020, val2 = 0x00000040 のとき (ある整数のうちのバイトが、別の整数のバイトと同じではないとき)
0xC0000020 & 0x00000040

0 //val1 & val2 は 0 になる

(0xC0000020) 11000000000000000000000000100000
(0x00000040) 00000000000000000000000001000000
  • ある整数が偶数か奇数か調べる
( val1 & 1 )
例1: ある整数 val1 が 奇数のとき
// val1 = 3
0011 //3
0001 //1

0001 //1

例2: ある整数 val2 が偶数のとき
// val2 = 4
0100 //4
0001 //1

0000 //0

つまり、ある整数が奇数のときは、& 1 の結果は、1になる
if ( val & 1 ) {
    // 奇数の場合の処理
    }
else {
    //偶数の場合の処理
}
  • ある整数フラグ flg をゼロにする
flg &= ~1; //flg = 1 のとき、flg はこれで 0 になる
0001 //1
1110 //-2 (1 の bitwise complement)

0000 //0
  • ある整数 i を、n でアラインメントする
i が 277, n が 16の時、
277 & 0xfffffff0 // 0xfffffff0 は、'11111111111111111111111111110000'
  => 272
  • ある整数xを、より大きな整数y単位のインデックスzに変換する (64バイト = 1ブロック である場合、70バイトが何ブロック目にあたるかを算出する場合など)
z = x + (y-1) >> yが2の何乗か
(1025 + 1023) >> 10 //1024 = 1単位とした場合、1025が何ブロック目にいるか
2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment