2010-04-05 36 views
2

我決定做這樣Ç - 轉換爲二進制補

  • 翻轉數0 = 1,1 = 0
  • 加1 LSB
  • 當進,循環,直到數組[我] == 0

但我卡在最後一點;我怎麼能說在一個條件循環?

+0

array []包含什麼? – WhirlWind 2010-04-05 21:54:01

+4

爲什麼你需要將某些東西轉換成2s的恭維表示?我相信一切通常都是以這種方式存儲的。 – pajton 2010-04-05 21:54:24

+2

請說清楚你在說什麼。這時很難理解你的問題。你「轉換爲二進制補碼」是什麼?爲什麼? – AnT 2010-04-05 21:56:17

回答

0

所以,你將你的號碼存儲爲一個整數的數組,代表比特。 在附加的代碼示例中,您忘記了增加變量,並檢查它是否超出了數組的大小。

你可以寫這樣的事情(我假設數組的大小是):

for (i = 0; i < 5; i++) 
{ 
    if (array1[i] == 1) 
     array1[i] = 0; 
    else // we found a 0 
     array1[i] = 1; 
     break; 
} 
0

我不太清楚你在做什麼,但也許這將幫助:

#define countof(x) (sizeof(x)/sizeof(x[0])) 

// an 8-bit number 
int byte[8] = {0, 1, 1, 0, 1, 1, 1, 0}; // 1 = on, 0 = off 

// flip all bits 
for (size_t i = 0; i < countof(byte); ++i) 
{ 
    byte[i] = !byte[i]; 
} 

// add one 
for (size_t i = 0; i < countof(byte); ++i) 
{ 
    if (byte[i]) // if on 
    { 
     byte[i] = 0; // "add 1, reset to zero", and carry (no break) 
    } 
    else // if off 
    { 
     byte[i] = 1; // turn on 
     break; // nothing to carry, stop adding 
    } 

} 

(我不知道如何把你在正確的方向,而不只是解釋代碼,對不起,我覺得你也非常接近,這仍然是有幫助的。)

您會看到,當您添加一個時,如果該位已經是1,則將其重置爲零,然後沿着這些位繼續。如果該位爲零,則將其設置爲1,然後跳出循環。 (沒什麼可以隨身攜帶的,所以我們已經加入了。)

希望有所幫助。順便說一下,你會注意到這些位在上面的代碼中被「倒退」了。 LSB在索引0處。

2

您正在討論擴展算術。大多數處理器具有每次加法操作的執行結果和溢出結果,但C不提供對它們的訪問。

你的問題是,隨着數字變大,數字會變長。如果你處於最後一刻,而且需要執行,那麼你需要另外一點!這意味着你需要重新分配位數組(如果你使用的是數組)。

當然,更實際的解決方案是使用本地整數而不是單個位,因爲您的處理器已經很好地處理了二進制補碼。然後,您知道如果原始數字等於(unsigned) -1,則將結果添加到結果中。根本問題依然存在;如果您需要執行最後的unsigned,則需要分配另一個。

0

你可以做2的補在一個更簡單的方法類似波紋管:直到你找到一個1

  • 剛開第1後,翻轉的下一個未來的0至1和1至零
    • 去不變並繼續這樣做。如果MSB變爲0,則意味着溢出發生。

    你可以自己檢查算法的有效性。和實施應該是這樣的波紋管:

    // an 8-bit number 
    int number[8] = {0, 1, 1, 1, 0, 1, 0, 0}; 
    int i; 
    bool gotFirstOne = false; 
    
    // flip bits after you first encountered an 1 
    for (i = 0; i < 8; i++) 
    { 
        if(gotFirstOne == false){ 
         if(number[i] == 1) { 
          gotFirstOne = true; 
         } 
        } 
        else { 
         number[i] = !number[i]; 
        } 
    
    } 
    
    if(number[7] == 0) { 
        printf("Overflow occurred"); 
    } 
    

    乾杯!!!!

  • 0

    我回答2的補碼,記住這是12位補碼,你可以根據你的要求更改掩碼或整數類型。這是完美的工作,也可以使用宏來做到這一點。

    int twos_compliment(unsigned short a) 
    { 
        int result; 
        result = 0x0FFF&a; 
        result = (((result&0x800)?(0<<11):(1<<11))|((result&0x400)?(0<<10):(1<<10)) 
          |((result&0x200)?(0<<9):(1<<9))|((result&0x100)?(0<<8):(1<<8)) 
          |((result&0x080)?(0<<7):(1<<7))|((result&0x040)?(0<<6):(1<<6)) 
          |((result&0x020)?(0<<5):(1<<5))|((result&0x010)?(0<<4):(1<<4)) 
          |((result&0x008)?(0<<3):(1<<3))|((result&0x004)?(0<<2):(1<<2)) 
          |((result&0x002)?(0<<1):(1<<1))|((result&0x001)?0:1)); 
        return result=result+1; 
    }