ビット列中で「1」の桁数を求めるとは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > ビット列中で「1」の桁数を求めるの意味・解説 

ビット列中で「1」の桁数を求める

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/01 16:16 UTC 版)

ルックアップテーブル」の記事における「ビット列中で「1」の桁数を求める」の解説

例えば、(二進数の)数字の中で「1」である桁数ハミング重み)を求める処理を考える。例えば、十進数の「37」は二進数では「100101」であり、「1」である3つある。 この処理をC言語記述した簡単な例を以下に示す。この例では、int型引数対象に「1」である数えている。 int count_ones(unsigned int x) { int result = 0; while (x != 0) result++, x = x & (x-1); return result;} この一見シンプルなアルゴリズムは、実際に実行すると、近代的なアーキテクチャプロセッサでも数百サイクル要する場合がある。これは、ループ中で繰り返し分岐処理が実行されるためである(分岐処理は遅いことが多い)。コンパイラによっては、最適化の際にこの処理をループ展開することで性能いくらか改善される場合もある。しかし、自明なハッシュ関数利用したアルゴリズムであればよりシンプルかつ高速に処理が行える。 256個の要素を持つ静的テーブル(名前はbit_setとする)を用意し各要素には0から255までの数の「1」の桁数格納するint型変数の各バイトの値を自明なハッシュ関数としてこのテーブルルックアップし、それを足し合わせるこの方であれば分岐発生せずメモリアクセスが4回発生するだけのため、上記コードよりもずっと高速である。 /* ('int'は32ビット幅と仮定) */int count_ones(unsigned int x) { return bits_set[ x & 0xFF] + bits_set[(x >> 8) & 0xFF] + bits_set[(x >> 16) & 0xFF] + bits_set[(x >> 24) & 0xFF] ;} 上記コードは、xを4バイトの unsigned char 配列キャストすれば、ビット積(&)とシフト取り除けるのでさらに高速化できる。また、関数化せずインライン実装してもよい。 なお、現在のプロセッサではこのようなテーブルルックアップは逆に速度低下起こす可能性がある。これは、改善前のコードはおそらく全てキャッシュ上から実行されるが、一方でルックアップテーブルキャッシュ載りきらなかった場合は、低速メモリへのアクセス発生するためである(さらに、上記の例では、4回のルックアップそれぞれにおいてテーブル中の要素アドレス計算する必要がある)。

※この「ビット列中で「1」の桁数を求める」の解説は、「ルックアップテーブル」の解説の一部です。
「ビット列中で「1」の桁数を求める」を含む「ルックアップテーブル」の記事については、「ルックアップテーブル」の概要を参照ください。

ウィキペディア小見出し辞書の「ビット列中で「1」の桁数を求める」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「ビット列中で「1」の桁数を求める」の関連用語

ビット列中で「1」の桁数を求めるのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



ビット列中で「1」の桁数を求めるのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaのルックアップテーブル (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS