TounsignedString法の解釈
整数には、INTを符号なしタイプの文字列に変換するような方法があることがわかりましたが、あまり明確ではないいくつかのポイントがあります。情報を照会した後、私はそれを次のように理解しています:
/***整数を署名のない番号に変換します。 */ private static string tounsignedstring(int i、int shift){char [] buf = new char [32]; int charpos = 32; int radix = 1 << Shift; int mask = radix -1; do {buf [-charpos] = digits [i&mask]; i >>> = shift; } while(i!= 0);新しい文字列(buf、charpos、(32 -charpos))を返します。 }ここでのパラメーターシフトは、バイナリシステムを表します。バイナリの場合、シフトは2、Octalは8、対応するマスクは1および7として計算されます。マスクを介して桁アレイの対応する文字を連続的に抽出します。
このようにして、私は毎回論理的な右シフト操作を実行し、最高のビットにゼロが補充されるため、連続論理的右シフトの後、私は0になります
さらに、私が0の場合、BUFアレイがその値を取得するのを防ぐことは、採用することです。
ToString法の解釈
//この配列は数の10桁の部分を表し、この配列は以下で使用されます。 final static char [] digittens = {'0'、 '0'、 '0'、 '0'、 '0'、 '0'、 '0'、 '0'、 '0'、 '0'、 '1' 1 '、' 1 '、' 1 '、' 1 '、' 1 '、' 1 '、' 1 '1' 1 '、' 2 '2' 2 '、「 '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', '5', '5', '5', '5', '5', 「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「5」、「6」 '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7'、 '7'、 '8' '、' 8 '、' 9 '、' 9 '、' 9 '、' 9 '、' 9 '、' 9 '、' 9 '、' 9 '、};配列の各部分が結合されている場合、100以内のすべてのケースで2桁の整数を取得できます。最終的な静的char [] digitones = {'0'、 '1' 1 '、' 2 '、' 4 '、' 5 '、' 6 '、' 7 '、' 8 '、' 9 '、' 0 '1'、 '4' '' 5 '5' 5 '5' 5 '5' 5 '5' 5 '5' 5 '5' 5 '5' 5 '5' 5 '5' 5 '5' 5 '5' 5 '5' 5 '5' 5 '5' 5 '5' '9'、 '0'、 '1'、 '2'、 '3'、 '4、' 5 '、' 5 '、' 6、 '6、' 8 '、' 9 '、' 0 '、' 1、 '2'、 '3'、 '4'、 '5'、 '6、' 7 '、' 8、 '9' '5' 5 '5' 5 '5'、「2」、「8」、「9」、「7」、「8」、「8」、「9」、「8」、「8」、「8」、「8」、「4」、「4」、「4」、「4」、「4」、「 '8'、 '9'、 '0' '' '' '、' 1、 '2'、 '3'、 '4、' 4、 '5'、 '6、' 7 '、' 8 '、' 9 '、' 9 '9' 9 '9' 9 '9' 9 '9' 9 '、' 3 '、' 4 '、' 5 '、' 6、 '7、' 8、 '5' 3 '、' 2 '、' 2 '、' 2 '、' 2 '、 '7'、 '8'、 '9'、 '9'、 '0'、 '1、' 2 '、' 3 '、' 4、 '4、' 6、 '7'、 '8' 8 '、' 9 '、' 1 '、' 2 '、' 3 '、' 4 '、' 5 '、' 6、 '7'、 '5'、 '6'、 '7'、 '8' '' '、' 9 '、' 0、 '1、' 2 '、' 3 '、' 4 '、' 5 '、' 6 '、' 7 '、' 8、 '0、' 1 '、' 2 '、' 3 '、' 4 '、' 5 '、' 6、 '7'、 '9'、 '9'、 '9'、 public static string toString(int i){if(i == integer.min_value)//ここに1を追加します。最初は、それが何を意味するのかわかりません。後で、負の数が見つかった場合、その前にネガティブサインを追加する必要があるため、文字列のサイズを追加する必要があります。 Stringsize(-i) + 1:Stringsize(i); char [] buf = new char [size]; getchars(i、size、buf);新しい文字列(0、size、buf)を返します。 } static void getchars(int i、int index、char [] buf){int q、r; int charpos = index; Char sign = 0; if(i <0){sign = ' - '; i = -i; } // 65536を超える整数の場合、最初に次の処理を実行します。//このプロセスでは100の単位で、つまり、残りは2桁で制御されます//これは上記の10桁および1桁のアレイにマップし、BUFアレイに2桁を一度に書き込みます。これは間違いなく、各桁を見つけるよりもはるかに高速です(i> = 65536){q = i / 100; //本当に:r = i - (q * 100); r = i - ((q << 6) +(q << 5) +(q << 2)); i = q; buf [--charpos] = digitones [r]; buf [--charpos] = gigittens [r]; } //小さな数字の場合は高速モードに倒れます// assert(i <= 65536、i); // 65536以下の整数の場合、次の部分を直接実行できます// //多分それは不正確であり、その後、除数に10を掛けて10桁を超える//パーツを取得します。このパートに10桁以上の数字で、(;;){q =(i * 52429)>>>(16+3)の1桁の数が得られます。 r = i - ((q << 3) +(q << 1)); // r = i-(q*10)... buf [ - charpos] = digits [r]; i = q; if(i == 0)break; } if(sign!= 0){buf [ - charpos] = sign; }} final static int [] sizetable = {9、99、999、9999、99999、99999、999999、99999、9999999、9999999、integer.max_value}; //これはここで最適化する必要があり、整数データのビットは、1つから10ビットのサイズ可能//介して保存されます:2147483647、//この処理方法は巧妙に静的なint stringsize(int i = 0;; i ++)if(x <= sizatable [i])i+1; }Highestonebitメソッドの解釈
public static int highestonebit(int i){// hd、図3-1 i | =(i >> 1); i | =(i >> 2); i | =(i >> 4); i | =(i >> 8); i | =(i >> 16); i-(i >>> 1); }この方法は非常に興味深いです。その本質を理解する前に、自分で計算しました。この方法の機能は、整数の最大ビットによって表される整数の値を見つけることです。この関数は、変位を通じてここで実現されます。簡単な例を見てみましょう。 128の場合、バイナリは1000 0000です。例として彼を取り上げましょう。
1桁を移動します
1000 0000
0100 0000
| ----------------
2桁を移動します
1100 0000
0011 0000
| -------------
4ビットを移動します
1111 0000
0000 1111
| -------------
8ビットを移動します
1111 1111
0000 0000
| -------------
モバイル16ビット
1111 1111
0000 0000
| -------------
1111 1111
最終結果はあなたが見ることができる通りです。次のビットはすべて1で満たされ、次のビットはすべて差し引かれて、整数が最高のビットで表されるようになります。
ビットカウントメソッド分析
public static int bitcount(int i){// hd、図5-2 i = i - ((i >>> 1)&0x55555555); i =(i&0x33333333) +((i >>> 2)&0x33333333); i =(i +(i >>> 4))&0x0f0f0f0f0f0f; i = i +(i >>> 8); i = i +(i >>> 16); I&0x3fを返します。 }この方法は、勉強するのに長い間本当に役に立たなかったので、後で私は大まかなアイデアを見つけました。
最初の行では、実装では、整数タイプのバイナリビットを2つと2つにグループ化し、2ビット中に1の数をカウントすることです。この式がどのように由来するかはわかりませんが、実際にはそうです。
2番目の行は、整数の4つのバイナリビットと4つのバイナリビットのグループ化を実装し、セグメント内のシフト添加を計算します。これは1001-> 10 + 01 = 11です。これは3つの1に相当します。 3番目の行は、整数の8つのバイナリビットをグループ化し、上記の方法と同様の変位を追加することです。もちろん、これはいくつかの特定のシフトと操作によって達成されます。
次は、16のグループと32のグループがあり、最後に統計を最後の数桁で表す統計にマージします。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。