是否有一种方法可以在c#中编写二进制文字,比如在十六进制前加上0x?0b不行。

如果不是,有什么简单的方法可以做到呢?某种字符串转换?


当前回答

从Visual Studio 2017 (c# 7.0)开始,您可以使用0b000001

其他回答

更新

c# 7.0现在有二进制字面值,这非常棒。

[Flags]
enum Days
{
    None = 0,
    Sunday    = 0b0000001,
    Monday    = 0b0000010,   // 2
    Tuesday   = 0b0000100,   // 4
    Wednesday = 0b0001000,   // 8
    Thursday  = 0b0010000,   // 16
    Friday    = 0b0100000,   // etc.
    Saturday  = 0b1000000,
    Weekend = Saturday | Sunday,
    Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday
}

最初的发布

由于主题似乎已经转向在枚举中声明基于位的标志值,因此我认为有必要指出这类事情的一个方便技巧。左移操作符(<<)将允许您将位推到特定的二进制位置。将其与根据同一类中的其他值声明枚举值的能力结合起来,您就拥有了非常易于阅读的位标志枚举声明性语法。

[Flags]
enum Days
{
    None        = 0,
    Sunday      = 1,
    Monday      = 1 << 1,   // 2
    Tuesday     = 1 << 2,   // 4
    Wednesday   = 1 << 3,   // 8
    Thursday    = 1 << 4,   // 16
    Friday      = 1 << 5,   // etc.
    Saturday    = 1 << 6,
    Weekend     = Saturday | Sunday,
    Weekdays    = Monday | Tuesday | Wednesday | Thursday | Friday
}

c# 6.0和Visual Studio 2015中没有实现二进制文字特性。但在2016年3月30日,微软宣布了Visual Studio '15'预览的新版本,我们可以使用二进制文字。

我们可以使用一个或多个下划线(_)字符作为数字分隔符。所以代码片段看起来像这样:

int x           = 0b10___10_0__________________00; //binary value of 80
int SeventyFive = 0B100_________1011; //binary value of 75

WriteLine($" {x} \n {SeventyFive}");

我们可以使用0b和0b中的任何一个,如上面的代码片段所示。

如果你不想使用数字分隔符,你可以像下面的代码片段一样使用它而不使用数字分隔符

int x           = 0b1010000; //binary value of 80
int SeventyFive = 0B1001011; //binary value of 75

WriteLine($" {x} \n {SeventyFive}");

恐怕只有整数和十六进制直接(ECMA 334v4):

9.4.4.2整型字面值整型字面值用于写入值 类型为int、uint、long和ulong。 整数字面值有两种可能 形式:十进制和十六进制。

要解析,你可以使用:

int i = Convert.ToInt32("01101101", 2);

基本上,我认为答案是否定的,没有简单的方法。使用十进制或十六进制常量——它们简单明了。@RoyTinkers的回答也很好-使用评论。

int someHexFlag = 0x010; // 000000010000
int someDecFlag = 8;     // 000000001000

这里的其他答案提供了几个有用的工作回合,但我认为它们并不比简单的答案更好。c#语言设计人员可能认为'0b'前缀是不必要的。HEX很容易转换为二进制,而且大多数程序员都必须知道0-8的DEC等价值。

此外,在调试器中检查值时,它们将显示为HEX或DEC。

虽然不可能使用文字,也许BitConverter也可以是一个解决方案?