2014-12-09 119 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; 
相关问题