SlideShare a Scribd company logo
Enviar búsqueda
Cargar
明日使えないすごいビット演算
Denunciar
Compartir
京大 マイコンクラブ
Seguir
•
95 recomendaciones
•
63,438 vistas
1
de
60
明日使えないすごいビット演算
•
95 recomendaciones
•
63,438 vistas
Denunciar
Compartir
Descargar ahora
Descargar para leer sin conexión
Tecnología
KMCの例会講座で用いたスライドを一部編集したものです。 ビット演算を組み合わせたトリッキーな方法で様々な操作を高速に行う方法を紹介します。
Leer más
京大 マイコンクラブ
Seguir
Recomendados
最小カットを使って「燃やす埋める問題」を解く por
最小カットを使って「燃やす埋める問題」を解く
shindannin
31.9K vistas
•
128 diapositivas
プログラムを高速化する話 por
プログラムを高速化する話
京大 マイコンクラブ
242.4K vistas
•
120 diapositivas
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~ por
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
57.8K vistas
•
51 diapositivas
勉強か?趣味か?人生か?―プログラミングコンテストとは por
勉強か?趣味か?人生か?―プログラミングコンテストとは
Takuya Akiba
71.8K vistas
•
69 diapositivas
組み込み関数(intrinsic)によるSIMD入門 por
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
47.6K vistas
•
122 diapositivas
最適化超入門 por
最適化超入門
Takami Sato
174.8K vistas
•
80 diapositivas
Más contenido relacionado
La actualidad más candente
プログラミングコンテストでの乱択アルゴリズム por
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
26.8K vistas
•
37 diapositivas
並列化による高速化 por
並列化による高速化
sakura-mike
6.7K vistas
•
64 diapositivas
指数時間アルゴリズム入門 por
指数時間アルゴリズム入門
Yoichi Iwata
44.8K vistas
•
98 diapositivas
競技プログラミングにおけるコードの書き方とその利便性 por
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
18.2K vistas
•
29 diapositivas
直交領域探索 por
直交領域探索
okuraofvegetable
12.3K vistas
•
57 diapositivas
動的計画法を極める! por
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
12.7K vistas
•
86 diapositivas
La actualidad más candente
(20)
プログラミングコンテストでの乱択アルゴリズム por Takuya Akiba
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
•
26.8K vistas
並列化による高速化 por sakura-mike
並列化による高速化
sakura-mike
•
6.7K vistas
指数時間アルゴリズム入門 por Yoichi Iwata
指数時間アルゴリズム入門
Yoichi Iwata
•
44.8K vistas
競技プログラミングにおけるコードの書き方とその利便性 por Hibiki Yamashiro
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
•
18.2K vistas
直交領域探索 por okuraofvegetable
直交領域探索
okuraofvegetable
•
12.3K vistas
動的計画法を極める! por HCPC: 北海道大学競技プログラミングサークル
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
•
12.7K vistas
プログラミングコンテストでのデータ構造 por Takuya Akiba
プログラミングコンテストでのデータ構造
Takuya Akiba
•
104.9K vistas
Re永続データ構造が分からない人のためのスライド por Masaki Hara
Re永続データ構造が分からない人のためのスライド
Masaki Hara
•
13K vistas
AVX-512(フォーマット)詳解 por MITSUNARI Shigeo
AVX-512(フォーマット)詳解
MITSUNARI Shigeo
•
8.9K vistas
様々な全域木問題 por tmaehara
様々な全域木問題
tmaehara
•
37.7K vistas
充足可能性問題のいろいろ por Hiroshi Yamashita
充足可能性問題のいろいろ
Hiroshi Yamashita
•
7.3K vistas
Binary indexed tree por HCPC: 北海道大学競技プログラミングサークル
Binary indexed tree
HCPC: 北海道大学競技プログラミングサークル
•
14.3K vistas
組合せ最適化入門:線形計画から整数計画まで por Shunji Umetani
組合せ最適化入門:線形計画から整数計画まで
Shunji Umetani
•
77.1K vistas
高速フーリエ変換 por AtCoder Inc.
高速フーリエ変換
AtCoder Inc.
•
74.7K vistas
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜 por Preferred Networks
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
•
14.6K vistas
プログラミングコンテストでのデータ構造 2 ~動的木編~ por Takuya Akiba
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
•
46K vistas
双対性 por Yoichi Iwata
双対性
Yoichi Iwata
•
25.8K vistas
Chokudai search por AtCoder Inc.
Chokudai search
AtCoder Inc.
•
14.1K vistas
Union find(素集合データ構造) por AtCoder Inc.
Union find(素集合データ構造)
AtCoder Inc.
•
169.1K vistas
組み込みでこそC++を使う10の理由 por kikairoya
組み込みでこそC++を使う10の理由
kikairoya
•
27K vistas
Destacado
CRC-32 por
CRC-32
7shi
30.9K vistas
•
64 diapositivas
ドット絵でプログラミング!難解言語『Piet』勉強会 por
ドット絵でプログラミング!難解言語『Piet』勉強会
京大 マイコンクラブ
7.9K vistas
•
45 diapositivas
Vivado hls勉強会5(axi4 stream) por
Vivado hls勉強会5(axi4 stream)
marsee101
7.7K vistas
•
73 diapositivas
Vivado hls勉強会1(基礎編) por
Vivado hls勉強会1(基礎編)
marsee101
27K vistas
•
184 diapositivas
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013 por
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
8.8K vistas
•
45 diapositivas
AAをつくろう! por
AAをつくろう!
Takami Sato
18.3K vistas
•
58 diapositivas
Destacado
(16)
CRC-32 por 7shi
CRC-32
7shi
•
30.9K vistas
ドット絵でプログラミング!難解言語『Piet』勉強会 por 京大 マイコンクラブ
ドット絵でプログラミング!難解言語『Piet』勉強会
京大 マイコンクラブ
•
7.9K vistas
Vivado hls勉強会5(axi4 stream) por marsee101
Vivado hls勉強会5(axi4 stream)
marsee101
•
7.7K vistas
Vivado hls勉強会1(基礎編) por marsee101
Vivado hls勉強会1(基礎編)
marsee101
•
27K vistas
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013 por Ryo Sakamoto
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
•
8.8K vistas
AAをつくろう! por Takami Sato
AAをつくろう!
Takami Sato
•
18.3K vistas
Word2vecで大谷翔平の二刀流論争に終止符を打つ! por Takami Sato
Word2vecで大谷翔平の二刀流論争に終止符を打つ!
Takami Sato
•
4.4K vistas
Data Science Bowl 2017Winning Solutions Survey por Takami Sato
Data Science Bowl 2017Winning Solutions Survey
Takami Sato
•
5.3K vistas
High performance python computing for data science por Takami Sato
High performance python computing for data science
Takami Sato
•
20K vistas
30分で博士号がとれる画像処理講座 por Sakiyama Kei
30分で博士号がとれる画像処理講座
Sakiyama Kei
•
12.2K vistas
NIPS2016論文紹介 Riemannian SVRG fast stochastic optimization on riemannian manif... por Takami Sato
NIPS2016論文紹介 Riemannian SVRG fast stochastic optimization on riemannian manif...
Takami Sato
•
5.6K vistas
Quoraコンペ参加記録 por Takami Sato
Quoraコンペ参加記録
Takami Sato
•
10.2K vistas
Icml2015 論文紹介 sparse_subspace_clustering_with_missing_entries por Takami Sato
Icml2015 論文紹介 sparse_subspace_clustering_with_missing_entries
Takami Sato
•
7.8K vistas
Scikit learnで学ぶ機械学習入門 por Takami Sato
Scikit learnで学ぶ機械学習入門
Takami Sato
•
98.1K vistas
IIBMP2016 深層生成モデルによる表現学習 por Preferred Networks
IIBMP2016 深層生成モデルによる表現学習
Preferred Networks
•
51.4K vistas
猫でも分かるVariational AutoEncoder por Sho Tatsuno
猫でも分かるVariational AutoEncoder
Sho Tatsuno
•
131.6K vistas
Similar a 明日使えないすごいビット演算
kagamicomput201710 por
kagamicomput201710
swkagami
373 vistas
•
23 diapositivas
kagami_comput2015_2 por
kagami_comput2015_2
swkagami
577 vistas
•
20 diapositivas
計算機理論入門03 por
計算機理論入門03
Tomoyuki Tarumi
1.8K vistas
•
29 diapositivas
kagamicomput201702 por
kagamicomput201702
swkagami
283 vistas
•
21 diapositivas
量子コンピュータのエミュレータ上でいろんな量子計算してみた por
量子コンピュータのエミュレータ上でいろんな量子計算してみた
DaikiUsami
852 vistas
•
42 diapositivas
kagamicomput201802 por
kagamicomput201802
swkagami
250 vistas
•
21 diapositivas
Similar a 明日使えないすごいビット演算
(20)
kagamicomput201710 por swkagami
kagamicomput201710
swkagami
•
373 vistas
kagami_comput2015_2 por swkagami
kagami_comput2015_2
swkagami
•
577 vistas
計算機理論入門03 por Tomoyuki Tarumi
計算機理論入門03
Tomoyuki Tarumi
•
1.8K vistas
kagamicomput201702 por swkagami
kagamicomput201702
swkagami
•
283 vistas
量子コンピュータのエミュレータ上でいろんな量子計算してみた por DaikiUsami
量子コンピュータのエミュレータ上でいろんな量子計算してみた
DaikiUsami
•
852 vistas
kagamicomput201802 por swkagami
kagamicomput201802
swkagami
•
250 vistas
kagami_comput2016_02 por swkagami
kagami_comput2016_02
swkagami
•
643 vistas
kagami_comput2015_6 por swkagami
kagami_comput2015_6
swkagami
•
860 vistas
足し算をつくろう por Yoichi Toyota
足し算をつくろう
Yoichi Toyota
•
649 vistas
Javaセキュアコーディングセミナー東京第2回講義 por JPCERT Coordination Center
Javaセキュアコーディングセミナー東京第2回講義
JPCERT Coordination Center
•
4.4K vistas
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編 por Unity Technologies Japan K.K.
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
Unity Technologies Japan K.K.
•
15K vistas
【Unity道場スペシャル 2017札幌】乱数完全マスター por Unity Technologies Japan K.K.
【Unity道場スペシャル 2017札幌】乱数完全マスター
Unity Technologies Japan K.K.
•
13.8K vistas
PHP でバイナリ変換プログラミング por Yo Ya
PHP でバイナリ変換プログラミング
Yo Ya
•
19K vistas
量子コンピューターとは? por MichihikoSugawara
量子コンピューターとは?
MichihikoSugawara
•
15 vistas
Bluetooth通信の仕組みと活用法紹介 por Takehiko YOSHIDA
Bluetooth通信の仕組みと活用法紹介
Takehiko YOSHIDA
•
12.7K vistas
レポート1 por YoshikazuHayashi3
レポート1
YoshikazuHayashi3
•
70 vistas
コンピュータシステムの理論と実装2 por H T
コンピュータシステムの理論と実装2
H T
•
1.5K vistas
第15回 配信講義 計算科学技術特論B(2022) por RCCSRENKEI
第15回 配信講義 計算科学技術特論B(2022)
RCCSRENKEI
•
174 vistas
kagami_comput2016_06 por swkagami
kagami_comput2016_06
swkagami
•
879 vistas
AtCoder Beginner Contest 008 解説 por AtCoder Inc.
AtCoder Beginner Contest 008 解説
AtCoder Inc.
•
14K vistas
Más de 京大 マイコンクラブ
Common Lisp入門 por
Common Lisp入門
京大 マイコンクラブ
1.9K vistas
•
267 diapositivas
多倍長整数の乗算と高速フーリエ変換 por
多倍長整数の乗算と高速フーリエ変換
京大 マイコンクラブ
3.2K vistas
•
32 diapositivas
つくってあそぼ ラムダ計算インタプリタ por
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
6.2K vistas
•
52 diapositivas
Geometry with Unity por
Geometry with Unity
京大 マイコンクラブ
4.8K vistas
•
43 diapositivas
セミコロンレスc++ por
セミコロンレスc++
京大 マイコンクラブ
5.8K vistas
•
17 diapositivas
エンジニアと健康 por
エンジニアと健康
京大 マイコンクラブ
6.3K vistas
•
57 diapositivas
Más de 京大 マイコンクラブ
(20)
Common Lisp入門 por 京大 マイコンクラブ
Common Lisp入門
京大 マイコンクラブ
•
1.9K vistas
多倍長整数の乗算と高速フーリエ変換 por 京大 マイコンクラブ
多倍長整数の乗算と高速フーリエ変換
京大 マイコンクラブ
•
3.2K vistas
つくってあそぼ ラムダ計算インタプリタ por 京大 マイコンクラブ
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
•
6.2K vistas
Geometry with Unity por 京大 マイコンクラブ
Geometry with Unity
京大 マイコンクラブ
•
4.8K vistas
セミコロンレスc++ por 京大 マイコンクラブ
セミコロンレスc++
京大 マイコンクラブ
•
5.8K vistas
エンジニアと健康 por 京大 マイコンクラブ
エンジニアと健康
京大 マイコンクラブ
•
6.3K vistas
女の子になれなかった人のために por 京大 マイコンクラブ
女の子になれなかった人のために
京大 マイコンクラブ
•
15.8K vistas
Pietで競プロしよう por 京大 マイコンクラブ
Pietで競プロしよう
京大 マイコンクラブ
•
4.5K vistas
もし太陽のコアがIntelCoreだったら por 京大 マイコンクラブ
もし太陽のコアがIntelCoreだったら
京大 マイコンクラブ
•
6.1K vistas
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの? por 京大 マイコンクラブ
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
京大 マイコンクラブ
•
22.7K vistas
プログラムを高速化する話Ⅱ 〜GPGPU編〜 por 京大 マイコンクラブ
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
•
67.4K vistas
No SSH (@nojima; KMC関東例会) por 京大 マイコンクラブ
No SSH (@nojima; KMC関東例会)
京大 マイコンクラブ
•
2K vistas
DTM練習会2017第1.5回 「伴奏の付け方」 por 京大 マイコンクラブ
DTM練習会2017第1.5回 「伴奏の付け方」
京大 マイコンクラブ
•
1.8K vistas
hideya流 テストプレイ観察術 por 京大 マイコンクラブ
hideya流 テストプレイ観察術
京大 マイコンクラブ
•
2.5K vistas
暗号技術入門 秘密の国のアリス 総集編 por 京大 マイコンクラブ
暗号技術入門 秘密の国のアリス 総集編
京大 マイコンクラブ
•
8.3K vistas
Altseed por 京大 マイコンクラブ
Altseed
京大 マイコンクラブ
•
3.4K vistas
C#でゲームを作る2016 第8回 por 京大 マイコンクラブ
C#でゲームを作る2016 第8回
京大 マイコンクラブ
•
2.2K vistas
C#でゲームを作る2016 第7回 por 京大 マイコンクラブ
C#でゲームを作る2016 第7回
京大 マイコンクラブ
•
1.5K vistas
C#でゲームを作る2016 第5回 por 京大 マイコンクラブ
C#でゲームを作る2016 第5回
京大 マイコンクラブ
•
1.7K vistas
C#でゲームを作る2016 第3回 por 京大 マイコンクラブ
C#でゲームを作る2016 第3回
京大 マイコンクラブ
•
1.2K vistas
Último
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 por
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PC Cluster Consortium
28 vistas
•
36 diapositivas
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 por
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PC Cluster Consortium
66 vistas
•
12 diapositivas
IPsec VPNとSSL-VPNの違い por
IPsec VPNとSSL-VPNの違い
富士通クラウドテクノロジーズ株式会社
606 vistas
•
8 diapositivas
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 por
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Hitachi, Ltd. OSS Solution Center.
109 vistas
•
26 diapositivas
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可 por
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可
Hitachi, Ltd. OSS Solution Center.
10 vistas
•
22 diapositivas
光コラボは契約してはいけない por
光コラボは契約してはいけない
Takuya Matsunaga
28 vistas
•
17 diapositivas
Último
(7)
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 por PC Cluster Consortium
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PC Cluster Consortium
•
28 vistas
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 por PC Cluster Consortium
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PC Cluster Consortium
•
66 vistas
IPsec VPNとSSL-VPNの違い por 富士通クラウドテクノロジーズ株式会社
IPsec VPNとSSL-VPNの違い
富士通クラウドテクノロジーズ株式会社
•
606 vistas
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 por Hitachi, Ltd. OSS Solution Center.
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Hitachi, Ltd. OSS Solution Center.
•
109 vistas
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可 por Hitachi, Ltd. OSS Solution Center.
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可
Hitachi, Ltd. OSS Solution Center.
•
10 vistas
光コラボは契約してはいけない por Takuya Matsunaga
光コラボは契約してはいけない
Takuya Matsunaga
•
28 vistas
定例会スライド_キャチs 公開用.pdf por Keio Robotics Association
定例会スライド_キャチs 公開用.pdf
Keio Robotics Association
•
146 vistas
明日使えないすごいビット演算
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.
おわり