SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
明日使えないすごいビット演算
Report
京大 マイコンクラブ
Follow
Dec. 18, 2013
•
0 likes
•
62,893 views
1
of
60
明日使えないすごいビット演算
Dec. 18, 2013
•
0 likes
•
62,893 views
Download Now
Download to read offline
Report
Technology
KMCの例会講座で用いたスライドを一部編集したものです。 ビット演算を組み合わせたトリッキーな方法で様々な操作を高速に行う方法を紹介します。
京大 マイコンクラブ
Follow
Recommended
直交領域探索
okuraofvegetable
12.1K views
•
57 slides
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
45.5K views
•
30 slides
プログラムを高速化する話
京大 マイコンクラブ
241.2K views
•
120 slides
プログラミングコンテストでの動的計画法
Takuya Akiba
91K views
•
59 slides
様々な全域木問題
tmaehara
37.3K views
•
71 slides
プログラミングコンテストでのデータ構造
Takuya Akiba
104K views
•
73 slides
More Related Content
What's hot
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
26.6K views
•
37 slides
Binary indexed tree
HCPC: 北海道大学競技プログラミングサークル
14.1K views
•
66 slides
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
57K views
•
51 slides
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
18.1K views
•
29 slides
最小カットを使って「燃やす埋める問題」を解く
shindannin
31.3K views
•
128 slides
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
12.5K views
•
86 slides
What's hot
(20)
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
•
26.6K views
Binary indexed tree
HCPC: 北海道大学競技プログラミングサークル
•
14.1K views
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
•
57K views
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
•
18.1K views
最小カットを使って「燃やす埋める問題」を解く
shindannin
•
31.3K views
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
•
12.5K views
ウェーブレット木の世界
Preferred Networks
•
55K views
最大流 (max flow)
HCPC: 北海道大学競技プログラミングサークル
•
12.6K views
色々なダイクストラ高速化
yosupo
•
24.8K views
Rolling Hashを殺す話
Nagisa Eto
•
3.9K views
充足可能性問題のいろいろ
Hiroshi Yamashita
•
7.1K views
グラフネットワーク〜フロー&カット〜
HCPC: 北海道大学競技プログラミングサークル
•
16.4K views
abc032
AtCoder Inc.
•
22.7K views
高速フーリエ変換
AtCoder Inc.
•
73K views
Convex Hull Trick
HCPC: 北海道大学競技プログラミングサークル
•
3.2K views
指数時間アルゴリズム入門
Yoichi Iwata
•
44.1K views
全域木いろいろ
HCPC: 北海道大学競技プログラミングサークル
•
6.9K views
組合せ最適化入門:線形計画から整数計画まで
Shunji Umetani
•
75.9K views
AtCoder Beginner Contest 007 解説
AtCoder Inc.
•
16.1K views
Rolling hash
HCPC: 北海道大学競技プログラミングサークル
•
9.1K views
Viewers also liked
CRC-32
7shi
30.4K views
•
64 slides
ドット絵でプログラミング!難解言語『Piet』勉強会
京大 マイコンクラブ
7.8K views
•
45 slides
Vivado hls勉強会5(axi4 stream)
marsee101
7.7K views
•
73 slides
Vivado hls勉強会1(基礎編)
marsee101
26.8K views
•
184 slides
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
8.8K views
•
45 slides
AAをつくろう!
Takami Sato
18.2K views
•
58 slides
Viewers also liked
(16)
CRC-32
7shi
•
30.4K views
ドット絵でプログラミング!難解言語『Piet』勉強会
京大 マイコンクラブ
•
7.8K views
Vivado hls勉強会5(axi4 stream)
marsee101
•
7.7K views
Vivado hls勉強会1(基礎編)
marsee101
•
26.8K views
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
•
8.8K views
AAをつくろう!
Takami Sato
•
18.2K views
Word2vecで大谷翔平の二刀流論争に終止符を打つ!
Takami Sato
•
4.4K views
Data Science Bowl 2017Winning Solutions Survey
Takami Sato
•
5.3K views
High performance python computing for data science
Takami Sato
•
20K views
30分で博士号がとれる画像処理講座
Sakiyama Kei
•
12.2K views
NIPS2016論文紹介 Riemannian SVRG fast stochastic optimization on riemannian manif...
Takami Sato
•
5.6K views
Quoraコンペ参加記録
Takami Sato
•
10.2K views
Icml2015 論文紹介 sparse_subspace_clustering_with_missing_entries
Takami Sato
•
7.8K views
Scikit learnで学ぶ機械学習入門
Takami Sato
•
98K views
IIBMP2016 深層生成モデルによる表現学習
Preferred Networks
•
51.2K views
猫でも分かるVariational AutoEncoder
Sho Tatsuno
•
130.8K views
Similar to 明日使えないすごいビット演算
kagamicomput201710
swkagami
366 views
•
23 slides
kagami_comput2015_2
swkagami
575 views
•
20 slides
計算機理論入門03
Tomoyuki Tarumi
1.8K views
•
29 slides
kagamicomput201702
swkagami
274 views
•
21 slides
量子コンピュータのエミュレータ上でいろんな量子計算してみた
DaikiUsami
814 views
•
42 slides
kagamicomput201802
swkagami
242 views
•
21 slides
Similar to 明日使えないすごいビット演算
(20)
kagamicomput201710
swkagami
•
366 views
kagami_comput2015_2
swkagami
•
575 views
計算機理論入門03
Tomoyuki Tarumi
•
1.8K views
kagamicomput201702
swkagami
•
274 views
量子コンピュータのエミュレータ上でいろんな量子計算してみた
DaikiUsami
•
814 views
kagamicomput201802
swkagami
•
242 views
kagami_comput2016_02
swkagami
•
638 views
kagami_comput2015_6
swkagami
•
853 views
足し算をつくろう
Yoichi Toyota
•
628 views
Javaセキュアコーディングセミナー東京第2回講義
JPCERT Coordination Center
•
4.4K views
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
Unity Technologies Japan K.K.
•
14.7K views
【Unity道場スペシャル 2017札幌】乱数完全マスター
Unity Technologies Japan K.K.
•
13.6K views
PHP でバイナリ変換プログラミング
Yo Ya
•
18.9K views
量子コンピューターとは?
MichihikoSugawara
•
14 views
Bluetooth通信の仕組みと活用法紹介
Takehiko YOSHIDA
•
12.6K views
レポート1
YoshikazuHayashi3
•
68 views
コンピュータシステムの理論と実装2
H T
•
1.5K views
第15回 配信講義 計算科学技術特論B(2022)
RCCSRENKEI
•
168 views
kagami_comput2016_06
swkagami
•
874 views
AtCoder Beginner Contest 008 解説
AtCoder Inc.
•
14K views
More from 京大 マイコンクラブ
Common Lisp入門
京大 マイコンクラブ
1.9K views
•
267 slides
多倍長整数の乗算と高速フーリエ変換
京大 マイコンクラブ
3.2K views
•
32 slides
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
6.2K views
•
52 slides
Geometry with Unity
京大 マイコンクラブ
4.8K views
•
43 slides
セミコロンレスc++
京大 マイコンクラブ
5.8K views
•
17 slides
エンジニアと健康
京大 マイコンクラブ
6.1K views
•
57 slides
More from 京大 マイコンクラブ
(20)
Common Lisp入門
京大 マイコンクラブ
•
1.9K views
多倍長整数の乗算と高速フーリエ変換
京大 マイコンクラブ
•
3.2K views
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
•
6.2K views
Geometry with Unity
京大 マイコンクラブ
•
4.8K views
セミコロンレスc++
京大 マイコンクラブ
•
5.8K views
エンジニアと健康
京大 マイコンクラブ
•
6.1K views
女の子になれなかった人のために
京大 マイコンクラブ
•
15.7K views
Pietで競プロしよう
京大 マイコンクラブ
•
4.5K views
もし太陽のコアがIntelCoreだったら
京大 マイコンクラブ
•
6K views
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
•
22.6K views
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
•
67.2K views
No SSH (@nojima; KMC関東例会)
京大 マイコンクラブ
•
2K views
DTM練習会2017第1.5回 「伴奏の付け方」
京大 マイコンクラブ
•
1.8K views
hideya流 テストプレイ観察術
京大 マイコンクラブ
•
2.4K views
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
•
8.2K views
Altseed
京大 マイコンクラブ
•
3.4K views
C#でゲームを作る2016 第8回
京大 マイコンクラブ
•
2.1K views
C#でゲームを作る2016 第7回
京大 マイコンクラブ
•
1.5K views
C#でゲームを作る2016 第5回
京大 マイコンクラブ
•
1.6K views
C#でゲームを作る2016 第3回
京大 マイコンクラブ
•
1.2K views
Recently uploaded
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
NTT DATA Technology & Innovation
18 views
•
21 slides
gtk4_gem_usage.pdf
ssuser0ef4681
9 views
•
6 slides
IGDA Japan SIG Audio #20-1 室内・野外でのマイク収録と整音.pdf
IGDA Japan SIG-Audio
79 views
•
31 slides
松下研究室紹介_関西大学高槻キャンパスオープンキャンパス
Matsushita Laboratory
20 views
•
23 slides
HarukiShinkawa_FIT2023
Matsushita Laboratory
17 views
•
24 slides
20230912JSSST大会基調講演_丸山.pdf
Hiroshi Maruyama
147 views
•
58 slides
Recently uploaded
(7)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
NTT DATA Technology & Innovation
•
18 views
gtk4_gem_usage.pdf
ssuser0ef4681
•
9 views
IGDA Japan SIG Audio #20-1 室内・野外でのマイク収録と整音.pdf
IGDA Japan SIG-Audio
•
79 views
松下研究室紹介_関西大学高槻キャンパスオープンキャンパス
Matsushita Laboratory
•
20 views
HarukiShinkawa_FIT2023
Matsushita Laboratory
•
17 views
20230912JSSST大会基調講演_丸山.pdf
Hiroshi Maruyama
•
147 views
ReonHata_JSAI2023
Matsushita Laboratory
•
12 views
明日使えないすごいビット演算
1.
明日使えないすごいビット演算 KMC1回生 prime(Twitter id:@_primenumber)
2.
ビット演算とは ● ● ● コンピューター内で数値や文字列などのデータは2進数で記 録されている ビット演算とは、2進数を0/1の列として操作するような演算 のこと ビット反転 (C言語では ~x) – 各ビットの0/1を反転させる x 0
1 1 0 1 0 1 1 ~x 1 0 0 1 0 1 0 0
3.
ビット演算とは ● ビット論理和 (C言語では x|y) – 各桁を比較して、少なくとも一方が1なら1 x y 0
0 1 0 1 0 1 1 x|y 1 1 1 0 1 0 1 1 1 1 0 0 1 0 0 1
4.
ビット演算とは ● ビット論理積 (C言語では x&y) – 各桁を比較して、両方とも1なら1 x y 0
0 1 0 1 0 1 1 x&y 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 1
5.
ビット演算とは ● ビット排他的論理和 (C言語では x^y) – 各桁を比較して、片方のみが1なら1 x y 0
0 1 0 1 0 1 1 x^y 1 1 1 0 0 0 1 0 1 1 0 0 1 0 0 1
6.
ビット演算とは ● 左ビットシフト (C言語では x<<n) – x 各桁を左に指定した桁数ずらす 0
0 1 0 1 0 1 1 x<<3 0 1 0 1 1 0 0 0
7.
ビット演算とは ● 右ビットシフト (C言語では x>>n) – x 各桁を右に指定した桁数ずらす 0
0 1 0 1 0 1 1 x>>3 0 0 0 1 0 1 0 1 上位桁に何を詰めるかによっていくつか種類がある ● 0を詰める ● 元の最上位桁と同じ物を詰める
8.
ビット演算とは ● ビット演算は回路が単純になるため、とても高速なことが多い – – ● とはいえ最近のCPUだと加減乗算も同じぐらい速い 組み合わせて使うことも多い うまく使うとものすごい高速化できる – ● ● 単純な実装に比べて数十倍速くなることも 今回はビット演算を用いていろいろな操作を高速にする例を 挙げます 数値は2の補数表現で格納されているものとします
9.
明日使えないすごいビット演算 ● 「1になっている一番下の桁」を取得する – 2の何乗で割り切れるか,みたいなことが分かったりする data 0 1 0 1 1 0 0 0
10.
明日使えないすごいビット演算 ● 「1になっている一番下の桁」を取得する – 2の何乗で割り切れるか,みたいなことが分かったりする data 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0
11.
明日使えないすごいビット演算 ● 「1になっている一番下の桁」を取得する data & (-data) data 0 1 0 1 1 0 0 0 -data 1 0 1 0 1 0 0 0 実は,-dataは~data+1に等しい (足して0になるようにするため)
12.
明日使えないすごいビット演算 ● 「1になっている一番下の桁」を取得する data & (-data) data 0 1 0 1 1 0 0 0 -data 1 0 1 0 1 0 0 0 data
& (-data) 0 0 0 0 1 0 0 0 実は,-dataは~data+1に等しい (足して0になるため)
13.
明日使えないすごいビット演算 ● 「1になっている一番下の桁」を0にする data &= data-1 data 0 1 0 1 1 0 0 0 data-1 0 1 0 1 0 1 1 1 data
& data-1 0 1 0 1 0 0 0 0
14.
明日使えないすごいビット演算 ● 「1になっている一番上の桁」を求める – – ● 数値のだいたいの大きさを求める log2 ( n
) の整数部分を求めるのに使える これは一発では行かないが、うまい方法がある
15.
明日使えないすごいビット演算 ● 「1になっている一番上の桁」を求める – – ● 数値のだいたいの大きさを求める log 2 (
n ) の整数部分を求めるのに使える これは一発では行かないが、うまい方法がある – 二分探索!
16.
明日使えないすごいビット演算 ● 「1になっている一番上の桁」を求める 0 1 0 1 1 0 0 1 0xF0 1 1 1 1 0 0 0 0 ビット論理積 0 1 0 1 0 0 0 0
17.
明日使えないすごいビット演算 ● 「1になっている一番上の桁」を求める 0 1 0 1 1 0 0 1 0xF0 1 1 1 1 0 0 0 0 ビット論理積 0 1 0 1 0 0 0 0 != 0
18.
明日使えないすごいビット演算 ● 「1になっている一番上の桁」を求める 0 1 0 1 1 0 0 1 0xF0 1 1 1 1 0 0 0 0 ビット論理積 0 1 0 1 0 0 0 0 != 0 1になっている一番上の桁は上位4桁のどれか!
19.
明日使えないすごいビット演算 ● 「1になっている一番上の桁」を求める 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0xCC 1 1 0 0 1 1 0 0 ビット論理積 0 1 0 0 0 0 0 0
20.
明日使えないすごいビット演算 ● 「1になっている一番上の桁」を求める 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0xCC 1 1 0 0 1 1 0 0 ビット論理積 0 1 0 0 0 0 0 0 != 0 1になっている一番上の桁は上位2桁のどれか!
21.
明日使えないすごいビット演算 ● 「1になっている一番上の桁」を求める – data data data data data サンプルコード(32ビット) = = = = = data data data data data & & & & & 0xFFFF0000 0xFF00FF00 0xF0F0F0F0 0xCCCCCCCC 0xAAAAAAAA ? ? ? ? ? data data data data data & & & & & 0xFFFF0000 0xFF00FF00 0xF0F0F0F0 0xCCCCCCCC 0xAAAAAAAA : : : : : data; data; data; data; data;
22.
明日使えないすごいビット演算 ● ビット列を逆転する – 高速フーリエ変換などで用いる data 0 1 0 1 1 0 0 1 dataの逆転 1 0 0 1 1 0 1 0
23.
明日使えないすごいビット演算 ● ビット列を逆転する – これも一気にやるのは無理 data 0 0 1 data&0x55 data&0xAA 1 0 1 1 1 0 0 0 0 1 1 1 0
24.
明日使えないすごいビット演算 ● ビット列を逆転する data 0 1 0
1 1 0 0 1 (data&0x55)<<1 1 (data&0xAA)>>1 1 0 0 0 1 1 0
25.
明日使えないすごいビット演算 ● ビット列を逆転する data 0 1 0
1 1 0 0 1 (data&0x55)<<1 1 (data&0xAA)>>1 1 0 0 0 1 1 0 ビット論理和 1 0 1 0 0 1 1 0
26.
明日使えないすごいビット演算 ● ビット列を逆転する 変更前のdata 0 1 0
1 1 0 0 1 変更後のdata 1 0 1 0 0 1 1 0
27.
明日使えないすごいビット演算 ● ビット列を逆転する 0 1 0
1 1 0 0 1 変更後のdata 1 0 1 0 0 1 1 0 data&0x33 data&0xCC 1 0 1 0 1 0 0 1
28.
明日使えないすごいビット演算 ● ビット列を逆転する 0 1 0
1 1 0 0 1 変更後のdata 1 0 1 0 0 1 1 0 (data&0x33)<<2 1 0 (data&0xCC)>>2 1 0 1 0 0 1 1 0 1 0 1 0 0 1
29.
明日使えないすごいビット演算 ● ビット列を逆転する 0 1 0
1 1 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1
30.
明日使えないすごいビット演算 ● ビット列を逆転する 0 1 0
1 1 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0
31.
明日使えないすごいビット演算 ● ビット列を逆転する 0 1 0
1 1 0 0 1 1 0 0 1 1 0 1 0
32.
明日使えないすごいビット演算 ● ビット列を逆転する ● dataは32ビット符号なし型とする data = | data = | data
= | data = | data = ((data & ((data & ((data & ((data & ((data & ((data & ((data & ((data & (data << 0x55555555) 0xAA555555) 0x33333333) 0xCCCCCCCC) 0x0F0F0F0F) 0xF0F0F0F0) 0x00FF00FF) 0xFF00FF00) 16) | (data << >> << >> << >> << >> >> 1) 1); 2) 2); 4) 4); 8) 8); 16);
33.
明日使えないすごいビット演算 ● 1になっているビットの数を数える ● ビットレベルでハミング距離を取りたい時などに使う ● 素直な実装(int型を32bitと仮定) int count =
0; for (int i = 0;i < 32;i++) { count += (data >> i) & 1; }
34.
明日使えないすごいビット演算 ● 1になっているビットの数を数える ● ちょっと速い実装 int count =
0; for(; data; data &= data – 1) { ++count; } data &= data-1で1になっている一番小さい桁が0になる
35.
明日使えないすごいビット演算 ● ● 1になっているビットの数を数える けっこう速い実装 10進数 2進数 1の個数 0 00000000 0 1 00000001 1 2 00000010
1 3 00000011 2 4 00000100 1 ... ... ... 255 11111111 8 あらかじめ0~255までの数について1の個数を数えて配列に 入れておく
36.
明日使えないすごいビット演算 ● 1になっているビットの数を数える ● けっこう速い実装 int count =
0; count += table[data & 0xFF]; count += table[(data >> 8) & 0xFF]; count += table[(data >> 16) & 0xFF]; count += table[(data >> 24) & 0xFF]; table[256] : 1の個数が入った配列
37.
明日使えないすごいビット演算 ● 1になっているビットの数を数える ● 配列を使った実装はけっこう速い – 素直な方法の20倍くらい
38.
明日使えないすごいビット演算 ● 1になっているビットの数を数える ● 配列を使った実装はけっこう速い – ● 素直な方法の20倍くらい しかし、さらに倍くらい速い実装が存在する
39.
明日使えないすごいビット演算 1 0 1 1 0 1 0 0 各桁の0/1を「その桁の1の個数」と読み替えることができる
40.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 各桁の0/1を「その桁の1の個数」と読み替えることができる
41.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 0x55 0 1 0 1 0 1 0 1 ビット論理積 0個 1個 1個 0個
42.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 0xAA 1 0 1 0 1 0 1 ビット論理積 1個 1個 0個 0個 0
43.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 &0xAA 1個 &0x55 1個 0個 0個 1個 0個 1個 0個
44.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 1個 1個 0個 0個 0個 1個 1個 0個
45.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 1個 1個 0個 0個 0個 1個 1個 0個 足し算 0 1個 1 0個 0 1個 0 0個 2桁ごとに「その2桁にあった1の数」が格納された!!!
46.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 0 1個 &0xCC 0 1個 0個 1 &0x33 1 0 0個 1個 0 0個 0 0 1個 0個
47.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 0 1個 1 0個 1 0 0 1個 0 0個 0個 0 0個 1個 0 1個
48.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 0 1個 1 0個 1 0 0 1個 0 0個 0個 0 0個 1個 0 1個 0 1個 足し算 0 0 1 1個 0 0
49.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 0 0 1 1個 &0xF0 0 0 1 1個 0 0 1個 0 &0x0F 0 0 0 1個
50.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 0 0 1 1個 0 0 0 1個 0 0 0 1個 0 0 1 1個
51.
明日使えないすごいビット演算 1個 0個 1個
1個 0個 1個 0個 0個 0 0 1 1個 0 0 0 1個 0 0 0 1個 0 0 1 1個 0 0個 足し算 0 0 0 0 0 1
52.
明日使えないすごいビット演算 ● 1になっているビットの数を数える ● かなり速い実装(dataはunsigned int型) data = + data
= + data = + data = + data = + (data & 0x55555555) ((data & 0xAAAAAAAA) (data & 0x33333333) ((data & 0xCCCCCCCC) (data & 0x0F0F0F0F) ((data & 0xF0F0F0F0) (data & 0x00FF00FF) ((data & 0xFF00FF00) (data & 0x0000FFFF) ((data & 0xFFFF0000) >> 1); >> 2); >> 4); >> 8); >> 16);
53.
明日使えないすごいビット演算 ● こうして、苦労の末我々は爆速で1になっているビットの数を数 えるアルゴリズムを手に入れた!!!
54.
明日使えないすごいビット演算 ● ● こうして、苦労の末我々は爆速で1になっているビットの数を数 えるアルゴリズムを手に入れた!!! しかし・・・
55.
明日使えないすごいビット演算 ● ● ● こうして、苦労の末我々は爆速で1になっているビットの数を数 えるアルゴリズムを手に入れた!!! しかし・・・ IntelのSIMD拡張命令セット、SSE4.2から、ズバリ「1になって いるビットの数を数える」CPU命令が追加された!(popcnt)
56.
明日使えないすごいビット演算 ● ● ● こうして、苦労の末我々は爆速で1になっているビットの数を数 えるアルゴリズムを手に入れた!!! しかし・・・ IntelのSIMD拡張命令セット、SSE4.2から、ズバリ「1になって いるビットの数を数える」CPU命令が追加された!(popcnt) – 実際ビット演算を使ったアルゴリズムより2倍ほど速い
57.
明日使えないすごいビット演算 ● ● ● こうして、苦労の末我々は爆速で1になっているビットの数を数 えるアルゴリズムを手に入れた!!! しかし・・・ IntelのSIMD拡張命令セット、SSE4.2から、ズバリ「1になって いるビットの数を数える」CPU命令が追加された!(popcnt) – ● 実際ビット演算を使ったアルゴリズムより2倍ほど速い 我々の努力は無駄だった!!!!!
58.
まとめと注意 ● ● ビット演算はうまく使うととても高速 ぱっと見何してるか判りづらいのでバグを埋め込 みやすい – ものすごい高速化をする必要のないときは使わ ないほうが吉
59.
まとめと注意 ● ● ビット演算はうまく使うととても高速 ぱっと見何してるか判りづらいのでバグを埋め込 みやすい ものすごい高速化をする必要のないときは使わ ないほうが吉 CPU命令速い!!!!! – ● – 本当に高速化したいときはまずこっちを考えるべき
60.
おわり