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)