Java - 位插入

时间:2012-08-17 18:55:15

标签: java

我有一个很长的号码:

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' s可以是0.手段,

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

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

4 个答案:

答案 0 :(得分:3)

听起来你想要像bitStuffing那样屏蔽(&~^|)和转移(>>和{{ 1}})是您的首选工具。

<<

免责声明:我没有可用于编译的Java编译器,但它应该是这样的。

答案 1 :(得分:2)

我的第一个想法是:

提取需要保持在其位置的前x位(在您的示例中:10) - &gt;你可以通过循环创建适当的位掩码来实现这一点:

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

现在您可以创建插入的长号码 - &gt;只需将数字索引位置向左移动。

之后,您可以轻松构建新号码:

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

注意:((oldNumber >> index) << index)清除数字的右侧部分(此部分使用bistmask在末尾附加)。那么你只需要将这个结果移动插入的长度(为它创建空间)和/或插入(这需要通过索引向左移动:(insertion << index)。最后,或者数字的最后一部分(通过位掩码提取:oldNumber && bitmask)到这个结果,你就完成了。

注意:我没有测试过这段代码。但是,一般来说它应该可以工作,但你可能需要检查我的班次(无论是索引还是索引 - 大约1个)!

答案 2 :(得分:1)

如果您只有Long123,则需要先将其转换为二进制字符串。像这样:

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); 

我相信有更有效的方法可以做到这一点。

答案 3 :(得分: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表示高位)。