1

Bit Twiddling コードを書いている人を見るのは大好きですが、まったく理解できません。Hacker's Delight とhttp://graphics.stanford.edu/~seander/bithacks.htmlを読みましたが、何も理解できませんでした。

例えば:

どうやって1 | 2戻ってくるの3か、どうやっa ^=b; b ^= a; a ^=b;て値を交換するのかなど...

1 つの方法:

private T[] ensureCapacity(int minCapacity) {
   if (tmp.length < minCapacity) {
   // Compute smallest power of 2 > minCapacity
   newSize |= newSize >> 1;
   int newSize = minCapacity;
   newSize |= newSize >> 2;
   newSize |= newSize >> 4;
   newSize |= newSize >> 8;
   newSize |= newSize >> 16;
   newSize++;

    if (newSize < 0) // Not bloody likely!
      newSize = minCapacity;
    else
      newSize = Math.min(newSize, a.length >>> 1);

      @SuppressWarnings({"unchecked", "UnnecessaryLocalVariable"})
      T[] newArray = (T[]) new Object[newSize];
      tmp = newArray;
   }
   return tmp;
 }

以下の好きなことは何をしていますか:

int newSize = minCapacity;
newSize |= newSize >> 1;
newSize |= newSize >> 2;
newSize |= newSize >> 4;
newSize |= newSize >> 8;
newSize |= newSize >> 16;
newSize++;

また

newSize = Math.min(newSize, a.length >>> 1);

>>Joshua Bloch が壊れた二分探索を修正した後、 or演算子を使用する方>>>が安全であることがわかり>>>ました>>。助けてください。チュートリアルがある場合は、上記のソースに感謝します。

たとえば、ビットの出力を計算する最も簡単な方法は何1 | 2 = 3ですか?

つまり、計算機か何かを使用しない限り、ビット形式がどのように見えるかわかりません..これらのことを助けなしに計算する最も簡単な方法はありますか?

4

2 に答える 2

1

少し勉強する必要がありますが、バイナリ形式の数値を知るための簡単なチート シートを次に示します。

128 | 64 | 32 | 16 | 8 | 4 | 2 | 1

3 が必要な場合は、左から右に移動し、数値 3 を作成するために必要な値を含むスペースを埋めます。

128 | 64 | 32 | 16 | 8 | 4 | 2 | 1
                             X   X

2 + 1 = 3 なので、 でマークされたものX1s で置き換え、残りを0sで置き換えます。

00000011

番号 2 についても同様です。

128 | 64 | 32 | 16 | 8 | 4 | 2 | 1
                             X

そして、バイナリ結果は次のとおりです。

00000010

番号 47 の場合:

128 | 64 | 32 | 16 | 8 | 4 | 2 | 1
            X        X   X   X   X

バイナリ結果:

00101111

これはルールでも公式でも何でもありません。数値を少し速く変換し、頭の中で練習するのに役立つものです。ビットで遊びたい場合は、まだたくさん勉強する必要があります:-)

于 2013-05-14T17:35:22.260 に答える