我有一个很长的号码:
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) ;
答案 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)
如果您只有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);
我相信有更有效的方法可以做到这一点。
答案 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表示高位)。