2013-04-07 47 views
0

我必須編寫一個函數來計算以2的補碼形式表示int所需的位數。要求:計算所需的位數以表示2的補碼整數

1. can only use: ! ~ &^| + << >> 
2. no loops and conditional statement 
3. at most, 90 operators are used 

目前,我想是這樣的:

int howManyBits(int x) { 
    int mostdigit1 = !!(0x80000000 & x); 
    int mostdigit2 = mostdigit1 | !!(0x40000000 & x); 
    int mostdigit3 = mostdigit2 | !!(0x20000000 & x); 
    //and so one until it reach the least significant digit 
    return mostdigit1+mostdigit2+...+mostdigit32+1; 
} 

然而,這種算法是行不通的。它也超過了90個運營商的限制。任何建議,我該如何修復和改進這個算法?

+0

我需要更好的解釋你想要的號碼。假設輸入數字是十進制的68,即「01000010」二進制。你期望什麼答案? – 2013-04-07 20:44:35

回答

1

對於2的補碼整數,問題是負數。負數表示最重要的位:如果設置了,則表示負數。 2的補碼整數n的負值定義爲 - (1的n的補數)+1。
因此,我會首先測試負號。如果它被設置,則所需的比特數僅僅是可用來表示整數的比特數,例如, 32位。如果不是,則可以簡單地通過將n重複右移一位來計算所需的位數,直到結果爲零。如果n例如將是+1,例如, 000 ... 001,您必須將其右移一次以使結果爲零,例如, 1次。因此你需要1位來表示它。

+0

你不能簡單地用'1'來表示-1嗎?這會迫使1不僅僅是'1',以此類推。 – Patashu 2013-04-12 03:54:29

+0

你可以-1代表整數1加上一個符號位。但在這種情況下,硬件算術變得更加複雜。例如,如果您將(+)1和-1表示爲(+)1和-1( - )1,則添加這兩個數字需要首先檢查符號位,然後從第一個減去第二個1。在2的補碼錶示中,硬件加法器可以簡單地添加00000001和11111111,並計算正確的結果00000000(2的補碼錶示形式爲0)。 – 2013-04-12 18:05:12

相關問題