我有一个长度> 10 ^ 4的字符串,它只有二进制数。
我怎样才能获得1的补充?
示例 - Sting a = "0101"
我想要String b = "1010"
除了使用StringBuffer/StringBuilder
替换每个角色之外,还有更好的方法吗?
答案 0 :(得分:1)
它必须是一个字符串吗?如果CharSequence
足够,您可以这样做:
public class BinaryComplementCharSequence implements CharSequence {
private final String source;
public BinaryComplementCharSequence(String source) {
this.source = source;
}
@Override
public int length() {
return source.length();
}
@Override
public char charAt(int index) {
switch (source.charAt(index)) {
case '0':
return '1';
case '1':
return '0';
default:
throw new IllegalStateException();
}
}
@Override
public CharSequence subSequence(int start, int end) {
return new BinaryComplementCharSequence(source.substring(start, end));
}
@Override
public String toString() {
return new StringBuilder(length()).append(this).toString();
}
}
如果您确实需要String
,请调用toString()
(但再次使用StringBuilder)。
答案 1 :(得分:1)
我建议避免重新使用你使用BigInteger
的方向盘。它的not
方法几乎可以为您提供所需的内容,只有在应用于正数时才会给出负数。要恢复正数,请添加2 ^ n,其中n是原始字符串的长度:
String a = "0101";
BigInteger twoToLength = new BigInteger("2").pow(a.length());
String b = twoToLength.add(new BigInteger(a, 2).not()).toString(2);
System.out.println(b);
打印:
1010
构造函数2
的参数toString()
是表示二进制数的基数。
我们还没到那里:如果原始字符串有前导字符串,则不会打印结果中的前导零。您必须手动添加这些以获得与原始相同的字符串长度。我认为最简单的方法是添加2 ^(n + 1)而不是2 ^ n,因此我们确信在我们真正关心的位前面至少有一位。所以我们只有在转换回字符串后才删除这个位:
String a = "0101";
int length = a.length();
// add a couple of more bits in front to make sure we have a positive number
BigInteger twoToLengthPlus1 = BigInteger.ONE.shiftLeft(length + 1);
String b = twoToLengthPlus1.add(new BigInteger(a, 2).not()).toString(2);
// remove extra bits from the front again
b = b.substring(b.length() - length);
通过此更改1010
变为0101
。
答案 2 :(得分:0)
您已经明白了:使用StringBuilder
并单独替换每个血腥字符。
您还可以使用char数组:char ca[] = str.toCharArray()
来提取字符,修改ca
中的各个字符,String newstr =new String(ca)
以将数组打包回String
。可能会稍快一些。
选择。
答案 3 :(得分:0)
每个字符检查'1'并反转:
char[] charsConverted = new char[a.length()];
char[] charArray = a.toCharArray();
for (int i = 0; i < charArray.length; i++) {
boolean b = charArray[i] == '1';
charsConverted[i] = !b ? '1' : '0';
}
String b= String.valueOf(charsConverted);