我需要处理一个二进制数。

我试着写:

const char x = 00010000;

但这并没有起作用。

我知道我可以使用与00010000值相同的十六进制数,但我想知道在c++中是否有用于二进制数的类型,如果没有,是否有其他解决方案?


当前回答

template<unsigned long N>
struct bin {
    enum { value = (N%10)+2*bin<N/10>::value };
} ;

template<>
struct bin<0> {
    enum { value = 0 };
} ;

// ...
    std::cout << bin<1000>::value << '\n';

字面值最左边的数字仍然是1,但不管怎样。

其他回答

你可以使用bitset

bitset<8> b(string("00010000"));
int i = (int)(bs.to_ulong());
cout<<i;

您可以使用的最小单位是字节(char类型)。您可以使用位操作符来处理位。

至于整数字面值,您只能使用十进制(以10为基数)、八进制(以8为基数)或十六进制(以16为基数)数字。在C和c++中没有二进制(以2为基数)字面值。

八进制数前缀为0,十六进制数前缀为0x。十进制数没有前缀。

在c++ 0x中,你可以通过用户定义的文字来做你想做的事情。

你可以使用二进制字面值。它们是在c++ 14中标准化的。例如,

int x = 0b11000;

GCC中的支持

GCC中的支持开始于GCC 4.3(见https://gcc.gnu.org/gcc-4.3/changes.html),作为C语言家族的扩展(见https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html#C-Extensions),但从GCC 4.9开始,它现在被认为是c++ 14的特性或扩展(见GCC二进制文字和c++ 14的差异?)

Visual Studio中的支持

Visual Studio中的支持开始于Visual Studio 2015预览版(参见https://www.visualstudio.com/news/vs2015-preview-vs#C++)。

基于其他一些答案,但这个将拒绝具有非法二进制字面值的程序。前导0是可选的。

template<bool> struct BinaryLiteralDigit;

template<> struct BinaryLiteralDigit<true> {
    static bool const value = true;
};

template<unsigned long long int OCT, unsigned long long int HEX>
struct BinaryLiteral {
    enum {
        value = (BinaryLiteralDigit<(OCT%8 < 2)>::value && BinaryLiteralDigit<(HEX >= 0)>::value
            ? (OCT%8) + (BinaryLiteral<OCT/8, 0>::value << 1)
            : -1)
    };
};

template<>
struct BinaryLiteral<0, 0> {
    enum {
        value = 0
    };
};

#define BINARY_LITERAL(n) BinaryLiteral<0##n##LU, 0x##n##LU>::value

例子:

#define B BINARY_LITERAL

#define COMPILE_ERRORS 0

int main (int argc, char ** argv) {
    int _0s[] = { 0, B(0), B(00), B(000) };
    int _1s[] = { 1, B(1), B(01), B(001) };
    int _2s[] = { 2, B(10), B(010), B(0010) };
    int _3s[] = { 3, B(11), B(011), B(0011) };
    int _4s[] = { 4, B(100), B(0100), B(00100) };

    int neg8s[] = { -8, -B(1000) };

#if COMPILE_ERRORS
    int errors[] = { B(-1), B(2), B(9), B(1234567) };
#endif

    return 0;
}

只需使用c++中的标准库:

#include <bitset>

你需要一个std::bitset类型的变量:

std::bitset<8ul> x;
x = std::bitset<8>(10);
for (int i = x.size() - 1; i >= 0; i--) {
      std::cout << x[i];
}

在本例中,我将10的二进制形式存储在x中。

8ul定义了位的大小,所以7ul意味着7位等等。