2012-12-04 96 views
-1

有一個二進制字符串10001110,我知道它是使用2的補碼。我知道它會是8位。使用2的補碼將int從int轉換爲int

這是給我在unsigned int的形式,等於142

然後我需要將此轉換回10001110

然後反轉所有位並添加一個導致它等於01110010

然後將其轉換爲等於-114的signed int

我該怎麼做?我對C相對比較陌生,並且花了很多年時間試圖找出答案!

基本上我想編寫一個函數,它的unsigned int 142和返回signed int -114

+0

它會一直有8位?或者是什麼? – cHao

+0

是的,在這種情況下,我知道它是8位。我希望能夠將此作爲參數傳遞給函數。 –

+2

不是01110010只是114(不是-114)? –

回答

-1

這是我終於想出的解決方案。

#include <stdio.h> 
#include <stdlib.h> 

int getBit(int no, int bit) // get bit at certain position 
{ 
    bit--; 
    return (no & (1 << bit)) >> bit; 
} 

void complementNBits(int *no, int count) // invert certain number of bits 
{ 
    int i; 
    for(i=0; i<count; i++) 
    { 
     *no ^= 1 << i; 
    }; 
} 

int main() 
{ 
    unsigned int unsignedNo=142; 

    int negative = 0; 
    signed int signedNo=0; 

    // check if MSB is set to determine if negative 

    if (getBit(unsignedNo, 8)) // if MSB is set 
    { 
     negative = 1; 
     // invert these 8 bits and add 1. the rest of the MSBs will already be 0 
     complementNBits(&unsignedNo, 8); 
     unsignedNo++; 
    } 

    signedNo = unsignedNo; 
    if (negative) 
    { 
     signedNo = signedNo * -1; 
    } 

    printf("THE SIGNED INTEGER: %i\n", signedNo); 

} 

感謝大家的幫助!

+0

呃......爲什麼?!?請再看看我的回答。爲什麼在地球上你不能「投」這個價值? 「一個整數是什麼部分是一個整數... *位*總是*相同*」你不明白嗎? – paulsm4

+0

它不起作用,因爲MSB(符號)位在錯誤的位置,因爲int不等於8位。 –

+0

如果我正確理解你,我覺得你很困惑。一個8位的「-142」具有相同的低8位,並且相同的「1」MSB與32位的「-142」相同。或者是一個16位或64位的「-142」。唯一的區別是其中一個比其他的窄,並且在左側具有更少的「1」位。你不需要做任何折磨的點位操作來獲得你正在尋找的價值。試試:) – paulsm4

2

你並不需要改變的位模式。您只需簽名擴展以匹配signed int結果的位長。最簡單的方法是檢查輸入的符號位,然後用位長度向左或向右篩選-1(如果已設置)。

int toSignedInt(unsigned int value, int bitLength) 
{ 
    int signedValue = value; 
    if (value >> (bitLength - 1)) 
     signedValue |= -1 << bitLength; 
    return signedValue; 
} 

說明

在8位二進制complelement爲一個無符號的142和-114簽名的位模式是相同的。所以如果你的整數類型是8位,你只需要轉換類型。但是,如果你有32位整數,但是你想把它們看作是8位二進制補碼,那麼如果符號位爲1,那麼你需要將左邊的24位設置爲1 1.

+0

'128&-1 == 128',如果我們假設是2的補碼,如果我們不這樣做,那麼$ DEITY就知道你會得到什麼 – cHao

+0

我一直認爲'x&= -1'不會改變' x' at all。也許你的意思是'x^= -1'? –

+0

Doh。我的錯誤應該是'value |(-1 << bitLength)' –

2

想想你能用位運算符做什麼。您可以測試一個位是否是1或0這樣的:

int bit = value & 1; 

你也可以在一個int位轉移是這樣的:

val = val >> 1; 

要測試的第i位在一個int你可以這樣做:

int bit = (value >> i) & 1; 

因此,使用這些信息,你可以轉換給定整成二進制和存儲在字符數組(它會以相反的順序已如果算上了!),那麼操作的char您的偏好。希望這是一個足夠大的暗示讓你站起來並開始。

+2

這聽起來像很多工作,當操作符'〜'可以一次反轉所有位時。 –

+0

雖然〜會反轉所有的位,但只有前8位被實際使用,所以只有這8位應該被反轉。所有其他位將已被設置爲0. –

0

難道你不能只從你給的任何價值中減去256?

+0

'int func(unsigned int value){return(unsigned char)( - value); ''也會做這項工作。 –

0

老兄 - 你爲什麼關閉你原來的問題?

我的響應是一樣的第一:

  • 一個整數,是整數。無論是「簽名」還是「未簽名」;無論是「補碼」還是「二進制補碼」 - 位總是相同的。如果要將帶符號的值「轉換」爲無符號值,C類型通常是最好,最簡單,最高效和最清晰的方法(代碼示例如下)。

  • 絕大多數的CPU架構爲二進制補碼

  • 如果出於某種原因,你要檢查你的CPU架構的補,然後就測試-0 == +0。二進制補碼不是一個「負零」(只是零)。一個補充呢。

PS:

問:基本上我想要寫一個函數,將unsigned int 142和返回符號int -114

答:

int silly_convert (int i) 
{ 
    return (signed char)i; 
} 

這與我在迴應您的原件時建議的完全相同帖子。

+0

我關閉了這個問題,因爲我沒有很好地解釋它。 –