_美馬さん_入門_ビット演算.pdf
by
akatsukinewgrad
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
入門 ビット演算 Akatsuki Geek Live 2022 Vol.1 2022/02/24 task
Slide 2
Slide 2 text
$ whoami Takashi Mima (task4233) 👀 バックエンドとセキュリティ 散歩とGo task4233.dev 最近は何故かJavaばかり書いてます 2
Slide 3
Slide 3 text
「入門 ビット演算」の目的 ビット演算の初学者に対して、 ・ビット演算とは何なのか ・ビット演算の利用例 ・ビット演算のメリットとデメリット を提示すること 補足 ・使い慣れている方はコメントやマサカリをお願いします ・説明には C++11 における演算子を用います 3
Slide 4
Slide 4 text
コンピュータはデータをビットの集合で表している ビット(0 or 1) ・0 と 1 の2通りの状態を表現できるデータの単位 ・電圧の高低などで管理される 例 ・単精度浮動小数点数(IEEE 754)は32ビットで1つの数値 ・ASCIIコードは7ビットで1文字 ・整数は利用ビット数に応じて範囲が変化する 4
Slide 5
Slide 5 text
ビット単位で行う演算がビット演算 演算子 説明 ~ (NOT) 値を反転する & (AND) 両方のビットが1ならば1、そうでなければ0 | (OR) どちらか一方が1なら1、そうでなければ0 ^ (XOR) どちらか一方のみが1なら1、そうでなければ0 << (左シフト) 指定した数だけビット列を左にずらす >> (右シフト) 指定した数だけビット列を右にずらす 5
Slide 6
Slide 6 text
ビット演算の利用例 組み込み・ゲームプログラミングでの状態管理 ・条件を満たしている(いない)を簡潔に表現できる ・bool で宣言するよりもメモリが節約できることがある →詳しくは こちら 集合の表現 ・組み合わせを列挙できる ・ネットワークのサブネットマスクとしても利用されている →詳しくは こちら 6
Slide 7
Slide 7 text
ビット演算のメリットとデメリット メリット ・利用するデータ領域を削減できることがある ・実行する機械語命令が少ないので高速になることがある デメリット ・可読性が落ちる可能性がある ・意図しない挙動が起きる可能性がある 7
Slide 8
Slide 8 text
ビット演算のメリットとデメリット メリット ・利用するデータ領域を削減できることがある ・実行する機械語命令が少ないので高速になることがある デメリット ・可読性が落ちる可能性がある →コメントを書くことによって「なぜ」を提示する ・意図しない挙動が起きる可能性がある →ユニットテストで振る舞いを保証する 8
Slide 9
Slide 9 text
まとめ ビット演算は ・利用するデータ領域を削減できることがある ・実行する機械語命令が少ないので高速になることがある ただし ・意図を書かないと可読性が落ちる可能性がある ・意図しない挙動が起きる可能性がある メリット、デメリットを吟味して 使ってみてください! ありがとうございました! 9
Slide 10
Slide 10 text
時間が余ったらやる小ネタ 10
Slide 11
Slide 11 text
2変数のみでのSwap void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } 1 void swap(int *a, int *b) { *a ^= *b; *b ^= *a; *a ^= *b; }
Slide 12
Slide 12 text
偶数ビットと奇数ビットのSwap ・各自のビットを抜き出してORでくっつけるイメージ int32_t swap_odd_and_even_bits(int32_t val) { return ((val & 0xaaaaaaaa) >> 1) | ((val & 0x55555555) << 1); } 1
Slide 13
Slide 13 text
マイナスを使わずに符号反転 ・詳しくは2の補数でググろう void inverse_sign(int *val) { *val = ~*val | 1; } 1
Slide 14
Slide 14 text
利用されるメモリ 意外とバイト数を無駄に利用していることがある ・bool は 1Byte ・std::bitset は 環境依存 ・boolに4バイトも利用している言語もある 1