二进制补码0到1,1到0

时间:2014-12-01 18:19:25

标签: java algorithm

我有一个数字,假设4是二进制表示为100,我想要实现的是补充数字,即将0替换为0,将0替换为1。我可以像这样实现它

public class Foo {
    public static void main(String[] args) {
        String binaryString = Integer.toBinaryString(4);

        StringBuilder out = new StringBuilder();
        char[] chars = binaryString.toCharArray();
        char x;
        for (char ch : chars) {
            if (ch == '1') {
                x = '0';
            } else {
                x = '1';
            }
            out.append(x);
        }
        System.out.println(Integer.parseInt(out.toString(), 2));
    }
}

在时间复杂度方面实现相同结果的最有效方法是什么?请注意,输入可能是非常大的数字,我们需要处理整数溢出。

更新 否定像~n之类的数字会给出错误的结果,例如

System.out.println(~4); 
outputs -5 , expected 3 

4 个答案:

答案 0 :(得分:3)

  

在时间复杂度方面实现相同结果的最有效方法是什么?

鉴于int的大小固定为32,时间复杂度为O(1)。但是,你的程序效率很低,因为它创建了一个字符串轿跑,字符串解析等等。

如果你完全跳过转换为二进制,你可以更快地做到这一点,并简单地反转数字,如下所示:

int val = 4;
int msb = int msb = 32 - Integer.numberOfLeadingZeros(val);
int inverse = ~val & ((1 << msb)-1);
System.out.println(inverse);

~运算符是一元运算符,它生成值的二进制补码。循环计算最高有效位(MSB)的位置。 ((1 << msb)-1)是一个掩码,用于删除高于MSB的所有位。

Demo.

答案 1 :(得分:1)

您可以尝试使用按位否定:

private int flipBits(int n) {
     return ~n;
}

答案 2 :(得分:1)

为什么不这样做:

public static void main(String[] args) {
        String binaryString = Integer.toBinaryString(4);
        binaryString = binaryString.replaceAll("1", "-");
        binaryString = binaryString.replaceAll("0", "1");
        binaryString = binaryString.replaceAll("-", "0");

只需转换3行代码......

答案 3 :(得分:0)

BigInteger允许您使用多个任意长度。找到否定的方法是在给定输入长度的情况下找到可能的最大值并从中减去输入值

   //you might want to validate that the string really is a binary number string
    BigInteger myNum = new BigInteger(inputStr, 2);
    BigInteger max = new BigInteger("2");
    max = max.pow(inputStr.length()).subtract(new BigInteger("1"));
    BigInteger ans = max.substract(myNum);