2015-12-24 39 views
0

用于将十进制数转换为其1的补码并再将该数转换为十进制的输出不如预期的那样。用于将十进制数转换为其补码的输出

我的方法

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

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

代码:

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; 
} 
+0

_注意:请不要发布替代方法approach._为什么不呢? –

+0

@Pétur我想亲自尝试一下。我的家庭作业,我需要做。我会作为一个单独的线程问。如果我没有得到 –

+0

@大家都很完美的解释。现在,我很困惑谁是最好的。 :P +1为你们所有人。 –

回答

2

首先,你需要定义amou你的二进制表示应该有的BIT位或补码表示没有意义。

如果转换100二进制是1100100
补充是0011011这是27
现在转换27。二进制是11011,补充00100这是4

查阅自己定义的8
10001100100的位长,补10011011,是155
15510011011,补01100100,是100
作品,因为每个二进制表示具有8个比特的长度。对于整个补充事物来说,这是绝对必要的。
请考虑您现在对可转换的数字有限制。
11111111这是255

既然我们谈到了,我会纠正你的代码

static int MAX_BITS = 8; 
static int MAX_INT = (int)Math.pow(2, MAX_BITS) - 1; 

public static int complimentDecimal(int num) 
{ 
    // check if number is to high for the bitmask 
    if(num > MAX_INT){ 
     System.out.println("Number=" + num + " to high for MAX_BITS="+MAX_BITS); 
     return -1; 
    } 

    // Your conversion works! 
    int p=0; 
    String s1=""; 
    //Convert Decimal to Binary 
    while(num>0) 
    { 
     p=num%2; 
     s1=p+s1; 
     num=num/2; 
    } 

    // fill starting zeros to match MAX_BITS length 
    while(s1.length() < MAX_BITS) 
     s1 = "0" + s1; 

    System.out.println(s1); 

    //Replace the 0s with 1s and 1s with 0s 

    // your approach on that is very wrong 
    StringBuilder sb = new StringBuilder(); 
    for(int j=0;j<s1.length();j++){ 
     if(s1.charAt(j)=='0') sb.append("1"); 
     else if(s1.charAt(j)=='1') sb.append("0"); 
    } 
    s1 = sb.toString(); 

    /* 
    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--) 
    { 
     // you don't want the char code here but the int value of the char code 
     //decimal += (s1.charAt(m) * Math.pow(2, k)); 
     decimal+=(Character.getNumericValue(s1.charAt(m))*Math.pow(2, k)); 

     k++; 
    } 
    return decimal; 
} 

附加说明:不要让更大然后MAX_BITS = 31或你需要在你的方法一起工作为int的长代替。

+0

请勿对未引用的文本使用引号格式。 – EJP

+0

@ArcticLord为什么你转换s1 = sb.toString()。我们也可以在sb上做同样的事情吗? –

+0

你可以,但是最好的做法是用[StringBuilder](https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html)建立一个'String',当你使用'toString()'方法将其存储为'String'。 – ArcticLord

1

问题(OK,问题之一)是在这里:

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

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

尝试

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

注: OK,对方的回答是right-- replace不工作不仅是你使用它不正确,通过不分配的结果,这不是正确的方法无论如何,因为s1.replace(s1.charAt(j),'1')'0'全部替换为'1'个字符;它不会替换字符j。如果您要专门替换String中的第j个字符,则需要使用substring()并构建一个新字符串,不是replace()。)

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

1

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

2

首先,你必须指定替换字符串已经定义的变量是,

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

应该

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

,并在未来的情况是,当你改变该命令会改变所有字符相似的匹配案例 参考Replace a character at a specific index in a string?

相关问题