2

長い配列に一連の長い数字があります。それぞれのLong番号を取得して、その最初のビットを取得し、最初のビットに従って、他のビットを処理したいと思います。次の擬似コードのように、

i = 1000000 ;
long[] a = new long[i];
for j = 0  to i
 do,
  get long lo = a[i];

  // get first bit of lo

  if first bit = 0
     print long number (by removing first bit) in file a1

  else 
     print long number (by removing first bit) in file a2

誰かが私を助けることができますか、「その長い番号の最初のビットを取得する」および「最初のビットを削除して番号を取得する」ための最速の方法は何ですか?

4

4 に答える 4

5

数値を 1 でビットマスクします。

long temp = a[i];
int bit = (temp >> 63) & 1;

これにより、数値が 63 桁にわたってビット単位でシフトされ、数値が 1 でシフトされます。これは、ビットが 1 の場合は 1 になり、ビットが 0 の場合は 0 になります。

最下位ビットが必要な場合は、シフトする必要はありません

int bit = temp & 1;
于 2012-04-25T20:57:21.583 に答える
3

twain249 はテスト部分で私を打ち負かしましたが、質問の他の部分に対する答えは次のとおりです。

long longWithoutTheFirstBit = a[i] & 0x7fffffff;
于 2012-04-25T20:59:48.593 に答える
1

最初のビットを取得します: number >>> 63-- 3 つの > 記号に注意してください -- これは符号なし右シフトです!

最初のビットを削除します。number & ~(1L << 63)

于 2012-04-25T21:01:14.453 に答える
1

long は 8 バイトの数値なので、最初のビットを取得するには


long l = ...
long firstBit = l & 0x80000000; // this will be 0 if the first bit is 0

2 の補数では、最初のビットが符号ビットであることに注意してください。

最初のビットなしで数値を取得するには、 l - firstBit または次のようにします

long noFirstBit = l & 0x7FFFFFFF

于 2012-04-25T21:00:19.810 に答える