dictScanアルゴリズムで使用されるソースコードで使用される逆効率的バイナリかつ実用的な非常に古典的なバイナリ反転アルゴリズムをRedisのが、また理解ビット・コンピューティングのための非常に大きな助けを有しています。まずソースを提示しました。
/ * 逆ビットに機能。アルゴリズムから: * http://graphics.stanford.edu/ 〜seander / bithacks.html#ReverseParallel * / 静的符号なしの長い REV(符号なしロングV){ 符号なしのロング S = 8。 * はsizeof(V); // 「ビットサイズは、2の累乗、ここでは32でなければなりません 符号なしロングマスク〜= 0 ; // 11111111111111111111111111111111 一方((= S >> 1)> 0){ / / 5サイクル ^ =(マスク<<単数または複数)をマスク; // 取得は、部分マスクスワップ所望 // 左及びsのビットがローに保持され、高sビット右シフトを保持し、2つの部分又は操作 // ここに達成するためにシフトの本質は、以下の理解するのに役立つ印刷情報と連動して、ある ((S << V)&〜| V =((V >> S)&マスク);マスク) } リターンV; }
ソースコードの一般的な考え方は次のとおり交換に8その後、16前及びスワップ後の反復がする最初の32ビットのバイナリ数16考え、8前同様の16後最初の16ビットの2進数の後に、リピート4の前に8ビットの2進数の最初の4ビットは交替しました。。。そして、最終的に全体のバイナリが逆転しました。もちろん、この実装プロセスは、それは大きな助けとしているコンピュータの原理の理解のために、このプロセスを理解し、また少し神秘的で魔法のような動作特性である、非常に賢いです。
しかし、上記の説明は非常に抽象的だった、のは、アルゴリズムの原則の理解を得るためには、アルゴリズムの実装にいくつかの印刷を追加してみましょう、上記のアルゴリズムを理解するために十分ではありません。
書式#include <iostreamの> 使用して 名前空間はstdを、 // バイナリ印刷 のボイド printBits(constの符号なしロング{Vを) 符号なしのロングマスク= 1 << 31 。 一方、((マスク)> 0 ){ int型のビット=(V&マスク)?1:0 。 coutの << ビット。 マスク >> = 1 。 } coutの << てendl; } スタティック符号なしのロング rev_test(符号なしロングV){ 符号なしのロング S = 8 * はsizeof(V)。// ビットサイズ。2の累乗でなければならない 符号なしの長い =〜マスク0 ; 裁判所未満 << " S:" ; printBits(S); 裁判所未満 << " マスク:" ; printBits(マスク)。 一方、((S >> = 1)> 0 ){ coutの << てendl; 裁判所未満 << " S:" ; printBits(S); 裁判所未満 << " マスク:" ; printBits(マスク)。 裁判所未満 << " マスク<< S:" ; printBits(マスク << S)。 マスク ^ =(マスク<< S)。 裁判所未満 << " マスク^ =:" ; printBits(マスク)。 V =((V >> S)&マスク)| ((V << S)&〜マスク)。 裁判所未満 << " V:" ; printBits(V); } リターンV; } INT メイン(){ 符号なしの長い V = 8 ; 裁判所未満 << " V:" ; printBits(V); coutの << てendl; V = rev_test(V)。 coutの << てendl; 裁判所未満 << " V:" ; printBits(V); coutの <<てendl <<てendl << てendl; システム(「一時停止」)。 リターン 0 ; }
上記の手順に以下の結果を実行します。