1

我有一个很长的号码,例如:

long l = Long.parseLong("10*000001111110" , 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

听起来您想要像 bitStuffing 这样的东西,其中掩蔽(&~^|)和移位(>><<)是您选择的工具。

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

好吧,如果你想在一个数字中设置一个特定的位:

打开它:

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 回答
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 回答