用于将十进制数转换为其补码的输出

时间:2015-12-24 07:02:57

标签: java string

将十进制数转换为1s补码然后再将数字转换为十进制的输出不符合预期。

MyApproach

我首先将数字从十进制转换为二进制。将所有Os替换为1,将替换为,然后将该数字转换为十进制。

任何人都可以指导我吗?我做错了什么?

代码:

public static int complimentDecimal(int num) {
    int p = 0;
    String s1 = "";
    // Convert Decimal to Binary

    while (num > 0) {
        p = num % 2;
        s1 = p + s1;
        num = num / 2;
    }
    System.out.println(s1);
    // Replace the 0s with 1s and 1s with 0s
    for (int j = 0; j < s1.length(); j++) {
        if (s1.charAt(j) == 0) {
            s1.replace(s1.charAt(j), '1');
        } else {
            s1.replace(s1.charAt(j), '0');
        }

    }
    System.out.println(s1);

    int decimal = 0;
    int k = 0;
    for (int m = s1.length() - 1; m >= 0; m--) {
        decimal += (s1.charAt(m) * Math.pow(2, k));

        k++;
    }
    return decimal;
}

4 个答案:

答案 0 :(得分:2)

首先,您必须将已替换的String分配给已定义的变量

s1.replace(s1.charAt(j),'1');

应该是

s1 = s1.replace(s1.charAt(j),'1');

接下来的情况是,当你按顺序改变时,它会改变所有类似匹配情况的字符 参考Replace a character at a specific index in a string?

答案 1 :(得分:2)

首先,您需要定义二进制表示应具有的位数或补码表示没有意义。

如果您转换'secret' => 'yoursecret';二进制文件为100
补码是11001000011011 现在转换27。二进制为27,补充1101100100

现在定义一个比特长度为8 4100,补充0110010010011011 155155,补充1001101101100100 可以工作,因为每个二进制表示的长度都是8位。这对于整个补充事物来说是绝对必要的 请考虑您现在对可转换的数字有限制 100 11111111。{/ p>

现在我们谈到了我将更正你的代码

255

附加说明:不要大于MAX_BITS = 31,否则你需要在方法中使用long而不是int。

答案 2 :(得分:1)

问题(好的,其中一个问题)就在这里:

if(s1.charAt(j)==0)

Java中的字符实际上是整数,范围是0到65535.这些数字中的每一个实际上都是指Unicode图表中与该数字对应的字符。字符'0'的值为48,而不是0.因此,当您创建了一个'0''1'字符串时,字符将具有整数值48和49.当然,当你将它与整数0进行比较时,无论如何都会得到false

尝试

if(s1.charAt(j)=='0')

注意:好的,另一个答案是对的 - replace不起作用。你不仅错误地使用它,不分配结果,这不是正确的方法无论如何,因为s1.replace(s1.charAt(j),'1')将所有'0'替换为'1'个字符;它不会替换字符j。如果您特意想要替换String中的第j个字符1}}使用其他内容,您需要使用substring()并构建新字符串,而不是replace()。)

还有其他注意事项:(1)整数不是“十进制”或“二进制”。当您的方法获得num参数时,这只是一个数字,而不是十进制数字或二进制数字。它在你的计算机中表示为二进制数字(除非你使用像Burroughs 3500这样的东西,但我认为所有这些都在Java发明之前就已经死了)。但它确实不被认为是十进制,二进制,八进制,十六进制,三进制或其他任何东西,直到你做一些将它转换为String的东西。 (2)我知道你说过不发布替代方法,但你可以用一行代替整个方法:return ~num;。这补充了所有的比特。如果您认为由于num是十进制数而无法执行此操作,请参阅#1。 (3)“赞美”意味着对某人说些好话。如果您正在谈论翻转所有位,正确的拼写是“补充”。

答案 3 :(得分:1)

String.Replace(oldChar, newChar)方法返回一个new字符串,该字符串是用newChar替换给定字符串中所有出现的oldChar。它不会对给定的字符串执行更改。