1

私は次のような長い数を持っています:

long l = Long.parseLong("10*000001111110" , 2) ;

ここで、1つの位置(たとえば、2番目の位置、*でマークされている)の2ビットを長い数値に追加します。

好き、

long l = Long.parseLong("10*11*000001111110" , 2) ; (given between *)

誰かが私にそれをする方法を手伝ってもらえますか?私が欲しいものを説明するために例を挙げていることに注意してください。実際には、私はそれだけlong lを持っており、それに取り組む必要があります。

編集:

1)位置は一定ではありません0、1、2..何でもかまいません。

2)およびmsbは0にすることができます。

long l = Long.parseLong("00000010*000001111110" , 2) ;

long l = Long.parseLong("00000010*11*000001111110" , 2) ;
4

4 に答える 4

3

マスキング(、、、、および)とシフト(および)が選択する楽器であるビットスタッフィングのようなもの&が必要なようです~^|>><<

long insertBit(long p_orignal, long p_new_bits, int p_starting_position_from_right, int p_ending_position_from_right)
{
     long returnValue = p_original;
     long onlyNewBits = 0;

     // Set the bit to zero
     long mask = (0xFFFFFFFFFFFFFFFFl);
     for (int i=p_starting_position_from_right; i<=p_ending_position_from_right; i++)
     {
          mask ^ (1l << i);
     }
     returnValue = returnValue & mask; 
     mask = ~mask;
     onlyNewBits = ~(p_new_bits & mask);
     returnValue |= onlyNewBits;

     return returnValue;
}

免責事項:これをコンパイルするために使用できるJavaコンパイラはありませんが、次のようになります。

于 2012-08-17T19:07:49.257 に答える
2

私が最初に思いついたのは次のとおりです。

現在の位置にとどまる必要がある最初のxビットを抽出します(例:10)->適切なビットマスクを作成するループを実行することでこれを行うことができます。

long bitmask = 1;
for(long bit = 1; bit < index; bit++) {
    bitmask = (bitmask << 1) | 1;
}

これで、挿入される長い数値を作成できます->その数値のインデックス位置を左にシフトするだけです。

その後、新しい番号を簡単に作成できます。

long number = (((oldNumber >> index) << index) << insertionLength) | (insertion << index) | (oldNumber && bitmask);

注:((oldNumber >> index) << index)番号の右側の部分をクリアします(この部分は、bistmaskを使用して最後に追加されます)。次に、この結果を挿入の長さ(スペースを空ける)または挿入(挿入するインデックスによって左にシフトする必要があります)だけシフトする必要があります(insertion << index)。最後に、またはの最後の部分oldNumber && bitmaskこの結果への番号(ビットマスク:)を介して抽出され、これで完了です。

注:このコードはテストしていません。ただし、通常は機能するはずですが、シフトを確認する必要がある場合があります(インデックスまたはインデックス-1程度)。

于 2012-08-17T19:16:40.507 に答える
1

値だけがある場合は、最初にこれをバイナリ文字列に変換する必要があるLongと言います。123そのようです:

String binaryValue = Long.toBinaryString("123L");

次に、文字列表現を取得し、次のような特定の文字の操作を実行します。

char[] characters = binaryValue.toCharArray();  
  char desiredCharacter = characters[index];  
  if(desiredCharacter == '1')  
  {    
       if(newValue == '1')  
       {
           desiredCharacter = '0';  
       }
  }else{
            if(newValue == '1')  
            {
                 desiredCharacter ='1';  
            }  
       }

最後に、変更された文字を次のような文字列に変換し直します。

String rebuiltString = new String(characters); 

これを行うにはもっと効率的な方法があると確信しています。

于 2012-08-17T19:07:44.770 に答える
1

さて、あなたが数に特定のビットを設定したいなら:

をつけるために:

number |=  (1 << pos) 
  if pos = 4:   (1<<pos) =   00000000 00000000 00000000 00010000

オフにするには:

number &= ~(1 << pos) 
  if pos = 4:   ~(1<<pos) =  11111111 11111111 11111111 11101111

ここで、posはビットの位置です(0は下位ビット、64は上位ビットです)。

于 2012-08-17T19:15:26.130 に答える