C#二进制文字

有没有办法在C#中编写二进制文字,如用0x前缀hex? 0b不起作用。

如果没有,那么做一个简单的方法是什么? 某种string转换?

C# 7.0支持二进制文字 (和通过下划线字符的可选数字分隔符)。

一个例子:

 int myValue = 0b0010_0110_0000_0011; 

您也可以在Roslyn GitHub页面上find更多信息。

由于这个话题似乎已经转向在枚举中声明基于位的标志值,所以我认为值得指出这种事情的一个方便的技巧。 左移运算符( << )将允许您将某位推到特定的二进制位置。 把它与在同一个类中用其他值声明枚举值的能力结合起来,并且对于位标志枚举,你有一个非常容易阅读的声明语法。

 [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 } 

直接只有整数和hex,恐怕(ECMA 334v4):

9.4.4.2整数文字整数文字用于写入int,uint,long和ulongtypes的值。 整数文字有两种可能的forms:十进制和hex。

要parsing,你可以使用:

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

添加@ StriplingWarrior有关枚举中位标志的答案,可以使用hex的简单约定来通过位移向上计数。 使用序列1-2-4-8,向左移动一列,然后重复。

 [Flags] enum Scenery { Trees = 0x001, // 000000000001 Grass = 0x002, // 000000000010 Flowers = 0x004, // 000000000100 Cactus = 0x008, // 000000001000 Birds = 0x010, // 000000010000 Bushes = 0x020, // 000000100000 Shrubs = 0x040, // 000001000000 Trails = 0x080, // 000010000000 Ferns = 0x100, // 000100000000 Rocks = 0x200, // 001000000000 Animals = 0x400, // 010000000000 Moss = 0x800, // 100000000000 } 

从右栏开始往下扫描,注意1-2-4-8(class次)1-2-4-8(class次)…


为了回答最初的问题,我第二个@ Sahuaginbuild议使用hex文字。 如果你经常使用二进制数字来处理这个问题,那么值得花一些时间来获取hex的值。

如果你需要在源代码中看到二进制数字,我build议像上面那样用二进制文字添加注释。

您始终可以创build准文字,常量包含您在之后的值:

 const int b001 = 1; const int b010 = 2; const int b011 = 3; // etc ... Debug.Assert((b001 | b010) == b011); 

如果你经常使用它们,那么你可以把它们包装在一个静态类中以供重用。

但是,如果你有任何与位相关的语义(在编译时已知),我会build议使用一个枚举:

 enum Flags { First = 0, Second = 1, Third = 2, SecondAndThird = 3 } // later ... Debug.Assert((Flags.Second | Flags.Third) == Flags.SecondAndThird); 

如果你看一下.NET编译器平台(“Roslyn”)的语言特性实现状态 ,你可以清楚地看到,在C#6.0中这是一个计划的特性,所以在下一个版本中我们可以用通常的方式来完成。

二进制文字状态

 string sTable="static class BinaryTable\r\n{"; string stemp = ""; for (int i = 0; i < 256; i++) { stemp = System.Convert.ToString(i, 2); while(stemp.Length<8) stemp = "0" + stemp; sTable += "\tconst char nb" + stemp + "=" + i.ToString() + ";\r\n"; } sTable += "}"; Clipboard.Clear(); Clipboard.SetText ( sTable); MessageBox.Show(sTable); 

使用这个,对于8位二进制,我使用这个来创build一个静态类,并把它放到剪贴板中。然后它被粘贴到项目中,并添加到Using部分,所以任何与nb001010从表中取出,在最less静态,但仍然…我使用C#很多PICgraphics编码和使用0b101010很多在高科技C

– 来自代码泄露的样本 –

 static class BinaryTable { const char nb00000000=0; const char nb00000001=1; const char nb00000010=2; const char nb00000011=3; const char nb00000100=4; //etc, etc, etc, etc, etc, etc, etc, } 

🙂 NEAL

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

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

 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}"); 

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

虽然stringparsingscheme是最stream行的,但是我不喜欢它,因为在某些情况下,parsingstring可能会有很好的性能。

当需要一种位域或二进制掩码时,我宁愿写它

long bitMask = 1011001;

然后

int bit5 = BitField.GetBit(bitMask,5);

要么

bool flag5 = BitField.GetFlag(bitMask,5);`

BitField类是哪里

 public static class BitField { public static int GetBit(int bitField, int index) { return (bitField / (int)Math.Pow(10, index)) % 10; } public static bool GetFlag(int bitField, int index) { return GetBit(bitField, index) == 1; } } 

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

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

其他人在这里回答了几个有用的工作 – 一轮,但我认为他们不是那么简单的答案。 C#语言devise者可能认为不需要“0b”前缀。 hex很容易转换为二进制,大多数程序员将不得不知道0-8的DEC等价物。

另外,在debugging器中检查值时,它们将显示为HEX或DEC。

您可以使用0b000001自Visual Studio 2017(C#7.0)