如何获取二进制字符串的1的补码

时间:2017-05-15 10:01:48

标签: java string

我有一个长度> 10 ^ 4的字符串,它只有二进制数。

我怎样才能获得1的补充?

示例 - Sting a = "0101"

我想要String b = "1010"

除了使用StringBuffer/StringBuilder替换每个角色之外,还有更好的方法吗?

4 个答案:

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