Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
京大 マイコンクラブ
65,970 views
明日使えないすごいビット演算
KMCの例会講座で用いたスライドを一部編集したものです。 ビット演算を組み合わせたトリッキーな方法で様々な操作を高速に行う方法を紹介します。
Technology
◦
Read more
96
Save
Share
Embed
Embed presentation
Download
Downloaded 251 times
1
/ 60
2
/ 60
3
/ 60
4
/ 60
5
/ 60
6
/ 60
7
/ 60
8
/ 60
9
/ 60
10
/ 60
11
/ 60
12
/ 60
13
/ 60
14
/ 60
15
/ 60
16
/ 60
17
/ 60
18
/ 60
19
/ 60
20
/ 60
21
/ 60
Most read
22
/ 60
23
/ 60
24
/ 60
25
/ 60
26
/ 60
27
/ 60
28
/ 60
29
/ 60
30
/ 60
31
/ 60
32
/ 60
33
/ 60
34
/ 60
35
/ 60
36
/ 60
37
/ 60
38
/ 60
39
/ 60
40
/ 60
41
/ 60
42
/ 60
43
/ 60
44
/ 60
45
/ 60
46
/ 60
47
/ 60
48
/ 60
49
/ 60
50
/ 60
51
/ 60
52
/ 60
Most read
53
/ 60
54
/ 60
55
/ 60
56
/ 60
57
/ 60
58
/ 60
59
/ 60
60
/ 60
Most read
More Related Content
PDF
最大流 (max flow)
by
HCPC: 北海道大学競技プログラミングサークル
PDF
Binary indexed tree
by
HCPC: 北海道大学競技プログラミングサークル
PDF
プログラムを高速化する話
by
京大 マイコンクラブ
PDF
プログラミングコンテストでのデータ構造 2 ~動的木編~
by
Takuya Akiba
PDF
プログラミングコンテストでのデータ構造
by
Takuya Akiba
PDF
プログラミングコンテストでの動的計画法
by
Takuya Akiba
PPTX
動的計画法を極める!
by
HCPC: 北海道大学競技プログラミングサークル
PDF
ウェーブレット木の世界
by
Preferred Networks
最大流 (max flow)
by
HCPC: 北海道大学競技プログラミングサークル
Binary indexed tree
by
HCPC: 北海道大学競技プログラミングサークル
プログラムを高速化する話
by
京大 マイコンクラブ
プログラミングコンテストでのデータ構造 2 ~動的木編~
by
Takuya Akiba
プログラミングコンテストでのデータ構造
by
Takuya Akiba
プログラミングコンテストでの動的計画法
by
Takuya Akiba
動的計画法を極める!
by
HCPC: 北海道大学競技プログラミングサークル
ウェーブレット木の世界
by
Preferred Networks
What's hot
PDF
直交領域探索
by
okuraofvegetable
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
by
Takuya Akiba
PDF
組み込み関数(intrinsic)によるSIMD入門
by
Norishige Fukushima
PDF
モデルアーキテクチャ観点からのDeep Neural Network高速化
by
Yusuke Uchida
PDF
Convex Hull Trick
by
HCPC: 北海道大学競技プログラミングサークル
PDF
プログラミングコンテストでの乱択アルゴリズム
by
Takuya Akiba
PDF
Re永続データ構造が分からない人のためのスライド
by
Masaki Hara
PPTX
モデル高速化百選
by
Yusuke Uchida
PDF
Deflate
by
7shi
PDF
Marp Tutorial
by
Rui Watanabe
PDF
競技プログラミングにおけるコードの書き方とその利便性
by
Hibiki Yamashiro
PDF
中3女子でもわかる constexpr
by
Genya Murakami
PDF
何となく勉強した気分になれるパーサ入門
by
masayoshi takahashi
PPTX
充足可能性問題のいろいろ
by
Hiroshi Yamashita
PDF
様々な全域木問題
by
tmaehara
PDF
最小カットを使って「燃やす埋める問題」を解く
by
shindannin
PDF
Union find(素集合データ構造)
by
AtCoder Inc.
PDF
CRC-32
by
7shi
PDF
組合せ最適化入門:線形計画から整数計画まで
by
Shunji Umetani
PDF
双対性
by
Yoichi Iwata
直交領域探索
by
okuraofvegetable
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
by
Takuya Akiba
組み込み関数(intrinsic)によるSIMD入門
by
Norishige Fukushima
モデルアーキテクチャ観点からのDeep Neural Network高速化
by
Yusuke Uchida
Convex Hull Trick
by
HCPC: 北海道大学競技プログラミングサークル
プログラミングコンテストでの乱択アルゴリズム
by
Takuya Akiba
Re永続データ構造が分からない人のためのスライド
by
Masaki Hara
モデル高速化百選
by
Yusuke Uchida
Deflate
by
7shi
Marp Tutorial
by
Rui Watanabe
競技プログラミングにおけるコードの書き方とその利便性
by
Hibiki Yamashiro
中3女子でもわかる constexpr
by
Genya Murakami
何となく勉強した気分になれるパーサ入門
by
masayoshi takahashi
充足可能性問題のいろいろ
by
Hiroshi Yamashita
様々な全域木問題
by
tmaehara
最小カットを使って「燃やす埋める問題」を解く
by
shindannin
Union find(素集合データ構造)
by
AtCoder Inc.
CRC-32
by
7shi
組合せ最適化入門:線形計画から整数計画まで
by
Shunji Umetani
双対性
by
Yoichi Iwata
Viewers also liked
PDF
ドット絵でプログラミング!難解言語『Piet』勉強会
by
京大 マイコンクラブ
PDF
Vivado hls勉強会5(axi4 stream)
by
marsee101
PDF
Vivado hls勉強会1(基礎編)
by
marsee101
PDF
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
by
Ryo Sakamoto
PDF
AAをつくろう!
by
Takami Sato
PDF
Word2vecで大谷翔平の二刀流論争に終止符を打つ!
by
Takami Sato
PDF
Data Science Bowl 2017Winning Solutions Survey
by
Takami Sato
PDF
High performance python computing for data science
by
Takami Sato
PPT
30分で博士号がとれる画像処理講座
by
Sakiyama Kei
PDF
NIPS2016論文紹介 Riemannian SVRG fast stochastic optimization on riemannian manif...
by
Takami Sato
PDF
Quoraコンペ参加記録
by
Takami Sato
PDF
Icml2015 論文紹介 sparse_subspace_clustering_with_missing_entries
by
Takami Sato
PDF
Scikit learnで学ぶ機械学習入門
by
Takami Sato
PDF
IIBMP2016 深層生成モデルによる表現学習
by
Preferred Networks
PPTX
猫でも分かるVariational AutoEncoder
by
Sho Tatsuno
ドット絵でプログラミング!難解言語『Piet』勉強会
by
京大 マイコンクラブ
Vivado hls勉強会5(axi4 stream)
by
marsee101
Vivado hls勉強会1(基礎編)
by
marsee101
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
by
Ryo Sakamoto
AAをつくろう!
by
Takami Sato
Word2vecで大谷翔平の二刀流論争に終止符を打つ!
by
Takami Sato
Data Science Bowl 2017Winning Solutions Survey
by
Takami Sato
High performance python computing for data science
by
Takami Sato
30分で博士号がとれる画像処理講座
by
Sakiyama Kei
NIPS2016論文紹介 Riemannian SVRG fast stochastic optimization on riemannian manif...
by
Takami Sato
Quoraコンペ参加記録
by
Takami Sato
Icml2015 論文紹介 sparse_subspace_clustering_with_missing_entries
by
Takami Sato
Scikit learnで学ぶ機械学習入門
by
Takami Sato
IIBMP2016 深層生成モデルによる表現学習
by
Preferred Networks
猫でも分かるVariational AutoEncoder
by
Sho Tatsuno
Similar to 明日使えないすごいビット演算
PDF
Javaセキュアコーディングセミナー東京第2回講義
by
JPCERT Coordination Center
PDF
kagami_comput2015_2
by
swkagami
PDF
kagami_comput2016_02
by
swkagami
PDF
kagamicomput201802
by
swkagami
PDF
kagamicomput201702
by
swkagami
PPT
計算機理論入門03
by
Tomoyuki Tarumi
PPTX
SIMDで整数除算
by
shobomaru
PDF
フラグを愛でる
by
MITSUNARI Shigeo
PDF
コンピューターの1+1
by
np_sugimoto
PDF
kagami_comput2015_3
by
swkagami
PDF
kagami_comput2016_03
by
swkagami
PDF
Haswellサーベイと有限体クラスの紹介
by
MITSUNARI Shigeo
PDF
Pyramid
by
tomerun
PDF
実行時のデータ型の表現手法
by
Atusi Maeda
PDF
kagamicomput201703
by
swkagami
PPTX
PHP でバイナリ変換プログラミング
by
Yo Ya
PPTX
T77 episteme
by
えぴ 福田
PDF
教育ガラパゴスは必要ですか?
by
Tsutomu Kawamura
PDF
実用Brainf*ckプログラミング
by
京大 マイコンクラブ
PDF
KLab勉強会#6 発表資料
by
Suguru Oho
Javaセキュアコーディングセミナー東京第2回講義
by
JPCERT Coordination Center
kagami_comput2015_2
by
swkagami
kagami_comput2016_02
by
swkagami
kagamicomput201802
by
swkagami
kagamicomput201702
by
swkagami
計算機理論入門03
by
Tomoyuki Tarumi
SIMDで整数除算
by
shobomaru
フラグを愛でる
by
MITSUNARI Shigeo
コンピューターの1+1
by
np_sugimoto
kagami_comput2015_3
by
swkagami
kagami_comput2016_03
by
swkagami
Haswellサーベイと有限体クラスの紹介
by
MITSUNARI Shigeo
Pyramid
by
tomerun
実行時のデータ型の表現手法
by
Atusi Maeda
kagamicomput201703
by
swkagami
PHP でバイナリ変換プログラミング
by
Yo Ya
T77 episteme
by
えぴ 福田
教育ガラパゴスは必要ですか?
by
Tsutomu Kawamura
実用Brainf*ckプログラミング
by
京大 マイコンクラブ
KLab勉強会#6 発表資料
by
Suguru Oho
More from 京大 マイコンクラブ
PDF
テキストファイルを読む💪 第1回
by
京大 マイコンクラブ
PDF
かわいくなろうとしたら語彙力が下がった話
by
京大 マイコンクラブ
PDF
Common Lisp入門
by
京大 マイコンクラブ
PDF
多倍長整数の乗算と高速フーリエ変換
by
京大 マイコンクラブ
PDF
つくってあそぼ ラムダ計算インタプリタ
by
京大 マイコンクラブ
PDF
Geometry with Unity
by
京大 マイコンクラブ
PDF
セミコロンレスc++
by
京大 マイコンクラブ
PDF
エンジニアと健康
by
京大 マイコンクラブ
PPTX
女の子になれなかった人のために
by
京大 マイコンクラブ
PDF
Pietで競プロしよう
by
京大 マイコンクラブ
ODP
もし太陽のコアがIntelCoreだったら
by
京大 マイコンクラブ
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
by
京大 マイコンクラブ
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
by
京大 マイコンクラブ
PDF
No SSH (@nojima; KMC関東例会)
by
京大 マイコンクラブ
PDF
DTM練習会2017第1.5回 「伴奏の付け方」
by
京大 マイコンクラブ
PPTX
hideya流 テストプレイ観察術
by
京大 マイコンクラブ
PDF
暗号技術入門 秘密の国のアリス 総集編
by
京大 マイコンクラブ
PDF
Altseed
by
京大 マイコンクラブ
PDF
C#でゲームを作る2016 第8回
by
京大 マイコンクラブ
PDF
C#でゲームを作る2016 第7回
by
京大 マイコンクラブ
テキストファイルを読む💪 第1回
by
京大 マイコンクラブ
かわいくなろうとしたら語彙力が下がった話
by
京大 マイコンクラブ
Common Lisp入門
by
京大 マイコンクラブ
多倍長整数の乗算と高速フーリエ変換
by
京大 マイコンクラブ
つくってあそぼ ラムダ計算インタプリタ
by
京大 マイコンクラブ
Geometry with Unity
by
京大 マイコンクラブ
セミコロンレスc++
by
京大 マイコンクラブ
エンジニアと健康
by
京大 マイコンクラブ
女の子になれなかった人のために
by
京大 マイコンクラブ
Pietで競プロしよう
by
京大 マイコンクラブ
もし太陽のコアがIntelCoreだったら
by
京大 マイコンクラブ
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
by
京大 マイコンクラブ
プログラムを高速化する話Ⅱ 〜GPGPU編〜
by
京大 マイコンクラブ
No SSH (@nojima; KMC関東例会)
by
京大 マイコンクラブ
DTM練習会2017第1.5回 「伴奏の付け方」
by
京大 マイコンクラブ
hideya流 テストプレイ観察術
by
京大 マイコンクラブ
暗号技術入門 秘密の国のアリス 総集編
by
京大 マイコンクラブ
Altseed
by
京大 マイコンクラブ
C#でゲームを作る2016 第8回
by
京大 マイコンクラブ
C#でゲームを作る2016 第7回
by
京大 マイコンクラブ
明日使えないすごいビット演算
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.
おわり
Download