Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
_美馬さん_入門_ビット演算.pdf
akatsukinewgrad
May 19, 2022
0
280
_美馬さん_入門_ビット演算.pdf
akatsukinewgrad
May 19, 2022
Tweet
Share
More Decks by akatsukinewgrad
See All by akatsukinewgrad
Bitcoinだけでスマートコントラクト.pdf
akatsukinewgrad
0
220
齋田.pdf
akatsukinewgrad
0
290
_Gunso_AktskGeekLive_LT会資料_20220224_スライド用.pptx.pdf
akatsukinewgrad
0
290
2月下旬開催_エンジニア職LT会_なかひこくん_.pdf
akatsukinewgrad
0
290
アカツキLT_2022_02_24..pdf
akatsukinewgrad
0
290
GeekLive_長期運用_安定リリースのための自動実機テスト__1_.pptx.pdf
akatsukinewgrad
0
300
WebExtensions の力で_不満を解消したい!_Google Cloud編
akatsukinewgrad
0
450
インターンでハチナイのAPIを高速化しました!
akatsukinewgrad
0
440
Railsのrenderをちょっと速くしました
akatsukinewgrad
0
440
Featured
See All Featured
JazzCon 2018 Closing Keynote - Leadership for the Reluctant Leader
reverentgeek
172
8.4k
Keith and Marios Guide to Fast Websites
keithpitt
404
21k
Statistics for Hackers
jakevdp
781
210k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
104
16k
Why Our Code Smells
bkeepers
PRO
324
55k
Support Driven Design
roundedbygravity
86
8.5k
Debugging Ruby Performance
tmm1
65
10k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_i
23
15k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
269
11k
Code Review Best Practice
trishagee
43
8.9k
Streamline your AJAX requests with AmplifyJS and jQuery
dougneiner
126
8.5k
Designing the Hi-DPI Web
ddemaree
272
32k
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