Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
_美馬さん_入門_ビット演算.pdf
Search
akatsukinewgrad
May 19, 2022
0
820
_美馬さん_入門_ビット演算.pdf
akatsukinewgrad
May 19, 2022
Tweet
Share
More Decks by akatsukinewgrad
See All by akatsukinewgrad
2023/1/25_QAテスター meet up!
akatsukinewgrad
0
110
成果発表資料.pdf
akatsukinewgrad
0
1.9k
広大なフィールドを気持ちよく駆け抜けるための技術.pdf
akatsukinewgrad
0
500
正規表現とReDoS.pdf
akatsukinewgrad
0
490
Unityで大量のオブジェクト_を吹き飛ばしたい.pdf
akatsukinewgrad
0
520
新卒2年目が思う1年目の学び.pdf
akatsukinewgrad
0
470
障害訓練の取り組みについて.pdf
akatsukinewgrad
0
620
7分でわかるアカツキゲームス
akatsukinewgrad
0
510
Bitcoinだけでスマートコントラクト.pdf
akatsukinewgrad
1
790
Featured
See All Featured
Become a Pro
speakerdeck
PRO
26
5.1k
RailsConf 2023
tenderlove
29
1k
Building an army of robots
kneath
303
45k
Automating Front-end Workflow
addyosmani
1368
200k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
240
Rebuilding a faster, lazier Slack
samanthasiow
80
8.8k
The Cost Of JavaScript in 2023
addyosmani
47
7.3k
Speed Design
sergeychernyshev
27
790
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.8k
Transcript
入門 ビット演算 Akatsuki Geek Live 2022 Vol.1 2022/02/24 task
$ whoami Takashi Mima (task4233) 👀 バックエンドとセキュリティ 散歩とGo
task4233.dev 最近は何故かJavaばかり書いてます 2
「入門 ビット演算」の目的 ビット演算の初学者に対して、 ・ビット演算とは何なのか ・ビット演算の利用例 ・ビット演算のメリットとデメリット を提示すること 補足 ・使い慣れている方はコメントやマサカリをお願いします
・説明には C++11 における演算子を用います 3
コンピュータはデータをビットの集合で表している ビット(0 or 1) ・0 と 1 の2通りの状態を表現できるデータの単位 ・電圧の高低などで管理される 例
・単精度浮動小数点数(IEEE 754)は32ビットで1つの数値 ・ASCIIコードは7ビットで1文字 ・整数は利用ビット数に応じて範囲が変化する 4
ビット単位で行う演算がビット演算 演算子 説明 ~ (NOT) 値を反転する & (AND) 両方のビットが1ならば1、そうでなければ0 |
(OR) どちらか一方が1なら1、そうでなければ0 ^ (XOR) どちらか一方のみが1なら1、そうでなければ0 << (左シフト) 指定した数だけビット列を左にずらす >> (右シフト) 指定した数だけビット列を右にずらす 5
ビット演算の利用例 組み込み・ゲームプログラミングでの状態管理 ・条件を満たしている(いない)を簡潔に表現できる ・bool で宣言するよりもメモリが節約できることがある →詳しくは こちら 集合の表現 ・組み合わせを列挙できる ・ネットワークのサブネットマスクとしても利用されている
→詳しくは こちら 6
ビット演算のメリットとデメリット メリット ・利用するデータ領域を削減できることがある ・実行する機械語命令が少ないので高速になることがある デメリット ・可読性が落ちる可能性がある ・意図しない挙動が起きる可能性がある 7
ビット演算のメリットとデメリット メリット ・利用するデータ領域を削減できることがある ・実行する機械語命令が少ないので高速になることがある デメリット ・可読性が落ちる可能性がある →コメントを書くことによって「なぜ」を提示する ・意図しない挙動が起きる可能性がある →ユニットテストで振る舞いを保証する 8
まとめ ビット演算は ・利用するデータ領域を削減できることがある ・実行する機械語命令が少ないので高速になることがある ただし ・意図を書かないと可読性が落ちる可能性がある ・意図しない挙動が起きる可能性がある メリット、デメリットを吟味して 使ってみてください! ありがとうございました!
9
時間が余ったらやる小ネタ 10
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; }
偶数ビットと奇数ビットのSwap ・各自のビットを抜き出してORでくっつけるイメージ int32_t swap_odd_and_even_bits(int32_t val) { return ((val & 0xaaaaaaaa)
>> 1) | ((val & 0x55555555) << 1); } 1
マイナスを使わずに符号反転 ・詳しくは2の補数でググろう void inverse_sign(int *val) { *val = ~*val |
1; } 1
利用されるメモリ 意外とバイト数を無駄に利用していることがある ・bool は 1Byte ・std::bitset は 環境依存 ・boolに4バイトも利用している言語もある 1