2012-12-31 191 views
0

如何判斷二進制數是負數?二進制十進制負數位集

目前我有下面的代碼。它工作正常轉換爲二進制。當轉換爲十進制時,我需要知道最左邊的位是否爲1來判斷它是否爲負數,但我似乎無法弄清楚如何做到這一點。

此外,而不是讓我的Bin2函數打印1的0,我怎麼能讓它返回一個整數?我不想將它存儲在一個字符串中,然後轉換爲int。

編輯:我正在使用8位數字。

int Bin2(int value, int Padding = 8) 
{ 
    for (int I = Padding; I > 0; --I) 
    { 
     if (value & (1 << (I - 1))) 
      std::cout<< '1'; 
     else 
      std::cout<<'0'; 
    } 

    return 0; 
} 

int Dec2(int Value) 
{ 
    //bool Negative = (Value & 10000000); 

    int Dec = 0; 
    for (int I = 0; Value > 0; ++I) 
    { 
     if(Value % 10 == 1) 
     { 
      Dec += (1 << I); 
     } 
     Value /= 10; 
    } 

    //if (Negative) (Dec -= (1 << 8)); 

    return Dec; 
} 

int main() 
{ 
    Bin2(25); 
    std::cout<<"\n\n"; 
    std::cout<<Dec2(11001); 
} 
+0

C++不支持二進制文字或二進制格式的打印數字。要處理二進制表示,你應該使用字符串。請注意'Dec2(11001)!= Dec2(00011001)'。 –

回答

2

您正在錯誤地檢查負值。代替運行以下:

bool Negative = (value & 0x80000000); //It will work for 32-bit platforms only 

,也可以與0

bool Negative = (value < 0); 
+0

我不確定是否按位編碼,並且符號位與所有編譯器一起工作。 –

+0

是的,我意識到了這一點,這就是爲什麼我添加了第二個選項。 – sgarizvi

+0

@BarnabasSzabolcs也不會爲64位工作。但後者顯然會。 – WhozCraig

2

只是比較一下,爲什麼你不把它比作0。應該工作得很好,幾乎可以肯定你不能以比編譯器更高效的方式來實現這一點。

+0

只適用於某些數字。它適用於11001,它是25.但它不適用於-12的11110100。 – Brandon

+0

@CantChooseUsernames所以你只使用8位數字,而不是一個整數的整個32位? –

+0

是的。所有的二進制數字都是八位數字。 – Brandon

2

我完全不清楚這是什麼OP是尋找,但它值得一折騰:

如果你知道你有一個簽署int的值應該是代表一個符號的8位值,你可以把它拆開,將其存儲在一個有符號的8位值,進而促進回本地int簽署價值是這樣的:

#include <stdio.h> 

int main(void) 
{ 
    // signed integer, value is 245. 8bit signed value is (-11) 
    int num = 0xF5; 

    // pull out the low 8 bits, storing them in a signed char. 
    signed char ch = (signed char)(num & 0xFF); 

    // now let the signed char promote to a signed int. 
    int res = ch; 

    // finally print both. 
    printf("%d ==> %d\n",num, res); 

    // do it again for an 8 bit positive value 
    // this time with just direct casts. 
    num = 0x70; 
    printf("%d ==> %d\n", num, (int)((signed char)(num & 0xFF))); 
    return 0; 
} 

輸出

245 ==> -11 
112 ==> 112 

你在做什麼?簡而言之,上面的代碼將採用位於num底部的8位數據,將它們視爲帶符號的8位值,然後將它們提升爲簽名本地int。結果是,您現在不僅可以「知道」8位是否爲負數(因爲res會是負數),您還可以在過程中獲得8位有符號數作爲本地int

在另一方面,如果所有你關心的是第8位是否在輸入int設置,並且應該表示負值狀態,那麼爲什麼不乾脆:

int IsEightBitNegative(int val) 
{ 
    return (val & 0x80) != 0; 
} 
相關問題