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

我试着写:

const char x = 00010000;

但这并没有起作用。

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


当前回答

c++提供了一个名为std::bitset的标准模板。如果你喜欢,可以试试。

其他回答

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

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

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

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

这篇文章可能会有所帮助。

/* Helper macros */
#define HEX__(n) 0x##n##LU
#define B8__(x) ((x&0x0000000FLU)?1:0) \
+((x&0x000000F0LU)?2:0) \
+((x&0x00000F00LU)?4:0) \
+((x&0x0000F000LU)?8:0) \
+((x&0x000F0000LU)?16:0) \
+((x&0x00F00000LU)?32:0) \
+((x&0x0F000000LU)?64:0) \
+((x&0xF0000000LU)?128:0)

/* User macros */
#define B8(d) ((unsigned char)B8__(HEX__(d)))
#define B16(dmsb,dlsb) (((unsigned short)B8(dmsb)<<8) \
+ B8(dlsb))
#define B32(dmsb,db2,db3,dlsb) (((unsigned long)B8(dmsb)<<24) \
+ ((unsigned long)B8(db2)<<16) \
+ ((unsigned long)B8(db3)<<8) \
+ B8(dlsb))


#include <stdio.h>

int main(void)
{
    // 261, evaluated at compile-time
    unsigned const number = B16(00000001,00000101);

    printf("%d \n", number);
    return 0;
}

它的工作原理!(所有的功劳都归于汤姆·托夫斯。)

正如前面所回答的,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。

你可以使用二进制字面值。它们是在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++)。

C语言没有用于纯二进制数的原生表示法。这里最好是八进制(例如07777)或十六进制(例如0xfff)。