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

我试着写:

const char x = 00010000;

但这并没有起作用。

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


当前回答

从c++ 14开始,你可以使用二进制字面值,现在它们是语言的一部分:

unsigned char a = 0b00110011;

其他回答

正如前面所回答的,C标准没有办法直接编写二进制数。不过,编译器也有扩展,显然c++ 14包含了二进制前缀0b。(请注意,这个答案最初发布于2010年。)

一种流行的解决方法是包含带有helper宏的头文件。一个简单的选择是生成一个包含所有8位模式宏定义的文件,例如:

#define B00000000 0
#define B00000001 1
#define B00000010 2
…

这导致只有256个#定义,如果需要大于8位的二进制常量,这些定义可以与移位和or组合,可能还可以使用辅助宏(例如BIN16(B00000001,B00001010))。(为每个16位(更不用说32位)值设置单个宏是不合理的。)

当然,这种语法的缺点是需要写入所有前导零,但这也可能使设置位标志和硬件寄存器内容等用途更加清晰。对于导致语法没有此属性的类函数宏,请参阅上面链接的bithacks.h。

我提出我的解决方案:

    #define B(x)                \
       ((((x) >>  0) & 0x01)    \
      | (((x) >>  2) & 0x02)    \
      | (((x) >>  4) & 0x04)    \
      | (((x) >>  6) & 0x08)    \
      | (((x) >>  8) & 0x10)    \
      | (((x) >> 10) & 0x20)    \
      | (((x) >> 12) & 0x40)    \
      | (((x) >> 14) & 0x80))

const uint8 font6[] = {
    B(00001110),    //[00]
    B(00010001),
    B(00000001),
    B(00000010),
    B(00000100),
    B(00000000),
    B(00000100),
    B(00000000),

我用这种方式定义了8位字体和图形,但也可以使用更宽的字体。宏B可以定义为生成0b格式,如果编译器支持的话。 操作:将二进制数解释为八进制,然后将位掩码并一起移位。中间值受到编译器可以处理的最大整数的限制,我猜64位应该可以。

它完全由编译器处理,不需要运行时代码。

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,但不管怎样。

下面是我的函数没有添加Boost库:

用法:BOOST_BINARY(00010001);

int BOOST_BINARY(int a){
    int b = 0;
    
    for (int i = 0;i < 8;i++){
        b += a % 10 << i;
        a = a / 10;
    }
    
    return b;
}

如果你正在使用GCC,那么你可以使用GCC扩展(包含在c++ 14标准中):

int x = 0b00010000;