2014-12-09 56 views
4

我正在閱讀convert bitset to int in c++的問題,並認爲,嘿,這不起作用,我已經嘗試過了。但後來我開始嘗試並很快我發現,將bitset <a>轉換爲signed int,其中<​​32

#include <bitset> 
#include <iostream> 
int main() 
{ 
    std::bitset<31> b31(-1); 
    std::bitset<32> b32(-1); 
    std::cout<<static_cast<int>(b31.to_ulong())<<std::endl; 
    std::cout<<static_cast<int>(b32.to_ulong())<<std::endl; 
    return 0; 
} 

使輸出

2147483647 
-1 

所以,我怎麼投位集比32小符號整數?

CLARIFICATION:我想在構造保存的位集時使用10個鹼基的值轉換回signed int。

我已經用gcc 4.6.2,mingw32的上贏7試過這個「商店位集簽署整數」,並與C風格得到相同的結果投(int)

+1

FWIW,這將產生'-1 -1'在OSX x64與鏗鏘3.5 – WhozCraig 2014-12-09 12:08:55

+0

好吧!我正要問我是否誤解了'to_ulong()'規範或者它是否是編譯器特定的。知道其他編譯器如何處理這個問題會很有意思,例如MSVC,如果讀者不想嘗試,請閱讀intel) – Schaki 2014-12-09 12:16:34

回答

2

如何沿着這些路線的東西:

#include <bitset> 
#include <iostream> 

template<std::size_t B> 
long bitset_to_long(const std::bitset<B>& b) { 
    struct {long x:B;} s; 
    return s.x = b.to_ulong(); 
} 

int main() 
{ 
    std::bitset<31> b31(-1); 
    std::bitset<32> b32(-1); 
    std::cout << bitset_to_long(b31) << std::endl; 
    std::cout << bitset_to_long(b32) << std::endl; 
    return 0; 
} 

(由Sign extending from a constant bit-width啓發)

1

讓已經在那些面具當比特集合中的最顯著位設置爲1,這樣剩餘的高位,並或將其與自投的無符號值:

const int sz = 15; 
std::bitset<sz> b(-1); 
int num = static_cast<int>(b.to_ulong()); 
if (b[sz-1]) { 
    int mask = (1<<sz)-1; 
    num |= ~mask; 
} 
std::cout << num << std::endl; 

表達(1<<sz)使得只有sz的位集數。 (1<<sz)-1將最後一個sz-1位設置爲1 s作爲掩碼。 ~將其反轉,產生一個二進制補碼來設置您的位值。

Demo.

+0

我認爲關鍵的一點是,bitset的MSB應該被視爲符號位。除非我誤讀,否則你將所有事情都否定。 – hvd 2014-12-09 11:55:28

+0

@ hvd我認爲你是對的。我希望OP提供更多的例子。無論如何,這現在已經修復。 – dasblinkenlight 2014-12-09 11:59:14

+0

向問題添加了詳細信息 – Schaki 2014-12-09 12:19:28

0

你需要符號擴展

#define BITLEN 31 
#define SHIFT_AMOUNT (sizeof(int)*CHAR_BIT - BITLEN) 

std::bitset<BITLEN> b31(-1); 
int v = (static_cast<int>(b31.to_ulong()) << SHIFT_AMOUNT) >> SHIFT_AMOUNT; 
std::cout << v << std::endl; 
相關問題