2015-12-24 38 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?

相關問題