是否有一种方法可以在c#中编写二进制文字,比如在十六进制前加上0x?0b不行。
如果不是,有什么简单的方法可以做到呢?某种字符串转换?
是否有一种方法可以在c#中编写二进制文字,比如在十六进制前加上0x?0b不行。
如果不是,有什么简单的方法可以做到呢?某种字符串转换?
当前回答
c# 7.0支持二进制文字(以及可选的下划线分隔符)。
一个例子:
int myValue = 0b0010_0110_0000_0011;
您也可以在Roslyn GitHub页面上找到更多信息。
其他回答
在@StriplingWarrior关于枚举中的位标志的回答中,有一个简单的约定,你可以在十六进制中使用,通过位移位向上计数。使用序列1-2-3 -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 (shift) 1-2-4-8 (shift)…
为了回答最初的问题,我赞同@Sahuagin的建议,使用十六进制字面量。如果您经常使用二进制数,以至于这成为一个问题,那么值得您花点时间来掌握十六进制的诀窍。
如果您需要在源代码中看到二进制数字,我建议像上面那样添加带有二进制文字的注释。
你总是可以创建准字面量,包含你想要的值的常量:
const int b001 = 1;
const int b010 = 2;
const int b011 = 3;
// etc ...
Debug.Assert((b001 | b010) == b011);
如果你经常使用它们,那么你可以把它们包装在一个静态类中以供重用。
然而,稍微偏离主题,如果你有任何与位相关的语义(在编译时已知),我建议使用Enum代替:
enum Flags
{
First = 0,
Second = 1,
Third = 2,
SecondAndThird = 3
}
// later ...
Debug.Assert((Flags.Second | Flags.Third) == Flags.SecondAndThird);
从Visual Studio 2017 (c# 7.0)开始,您可以使用0b000001
基本上,我认为答案是否定的,没有简单的方法。使用十进制或十六进制常量——它们简单明了。@RoyTinkers的回答也很好-使用评论。
int someHexFlag = 0x010; // 000000010000
int someDecFlag = 8; // 000000001000
这里的其他答案提供了几个有用的工作回合,但我认为它们并不比简单的答案更好。c#语言设计人员可能认为'0b'前缀是不必要的。HEX很容易转换为二进制,而且大多数程序员都必须知道0-8的DEC等价值。
此外,在调试器中检查值时,它们将显示为HEX或DEC。
虽然不可能使用文字,也许BitConverter也可以是一个解决方案?