Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#二进制文字_C#_Syntax_Binary - Fatal编程技术网

C#二进制文字

C#二进制文字,c#,syntax,binary,C#,Syntax,Binary,有没有办法用C#写二进制文字,比如在十六进制前加0x?0b不起作用 如果没有,什么是简单的方法?某种字符串转换?恐怕只能直接转换整数和十六进制(ECMA 334v4): 9.4.4.2整数文本整数文本用于写入 输入int、uint、long和ulong。 整数文本有两种可能的类型 形式:十进制和十六进制 要进行分析,可以使用: int i = Convert.ToInt32("01101101", 2); 虽然不能使用文字,但a也可能是解决方案?您始终可以创建准文字,这些常量包含您所追求的值:

有没有办法用C#写二进制文字,比如在十六进制前加0x?0b不起作用


如果没有,什么是简单的方法?某种字符串转换?

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

9.4.4.2整数文本整数文本用于写入 输入int、uint、long和ulong。 整数文本有两种可能的类型 形式:十进制和十六进制

要进行分析,可以使用:

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

虽然不能使用文字,但a也可能是解决方案?

您始终可以创建准文字,这些常量包含您所追求的值:

const int b001 = 1;
const int b010 = 2;
const int b011 = 3;
// etc ...
Debug.Assert((b001 | b010) == b011);
如果您经常使用它们,那么您可以将它们包装在一个静态类中以供重用

不过,有点离题,如果您有任何与位相关的语义(在编译时已知),我建议使用枚举:

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

虽然字符串解析解决方案是最流行的,但我不喜欢它,因为解析字符串在某些情况下会对性能造成很大影响

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

长位掩码=1011001

后来

int bit5=位域.GetBit(位掩码,5)

bool flag5=位域.GetFlag(位掩码,5)`

位字段类的位置

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;
    }
}
更新 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
}
原职 由于主题似乎已转向在枚举中声明基于位的标志值,因此我认为有必要为这类事情指出一个简便的技巧。左移位运算符(

:-)

NEAL

在@StriplingWarrior关于枚举中位标志的回答中添加了一个简单的约定,您可以使用十六进制来通过位移位向上计数。使用顺序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(移位)1-2-4-8(移位)


为了回答最初的问题,我支持@Sahuagin使用十六进制文字的建议。如果你经常使用二进制数,这会成为一个问题,那么学习十六进制是值得的


如果您需要在源代码中看到二进制数字,我建议添加带有二进制文字的注释,就像我上面提到的那样。

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

int someHexFlag = 0x010; // 000000010000
int someDecFlag = 8;     // 000000001000
这里的其他答案提供了几轮有用的工作,但我认为它们并不比简单的答案好。C语言设计者可能认为没有必要使用“0b”前缀。十六进制很容易转换成二进制,大多数程序员无论如何都必须知道0-8的DEC等价物

此外,在调试器中检查值时,它们将显示为十六进制或十二进制。

如果您查看.NET编译器平台(“Roslyn”)的详细信息,您可以清楚地看到,在C#6.0中,这是一项计划中的功能,因此在下一版本中,我们可以按常规方式执行

C#支持(以及通过下划线字符可选的数字分隔符)

例如:

int myValue = 0b0010_0110_0000_0011;

您还可以找到有关C#6.0和Visual Studio 2015中未实现的二进制文字功能的更多信息。但是2016年3月30日,微软发布了新版本的Visual Studio“15”预览版,我们可以使用二进制文本。

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

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

您可以使用
0b00001
,因为Visual Studio 2017(C#7.0)

位转换器有点棘手,因为它是机器端;在你的标准英特尔上,这意味着小endian。大多数人都很难读取小尾端文字…哎哟,现在我记得为什么我总是知道但从来没有使用BitConverter…BitConverter有一个字段
BitConverter.IsLittleEndian
,如果主机不是小尾端,你可以用它来测试(和反转缓冲区)。使用常量并给它们取正确的名称,那么,你必须用十进制写出来这一事实就无关紧要了。就个人而言,我想读<代码>(A==MaskFordMeimoEnabor)而不是<代码>(A==0B100101)< /Cord>另一个注意事项:如果您找到这个职位是因为您想要一个位字段,请考虑标志属性:这两个都是非常好的建议,除了定义所述位字段之外,其中,这些命名常量定义可以更容易地用二进制文本进行读写。[Flags]枚举数量{None=0,One=1,Some=0b10,Most=0b100,All=0b111}因为它的价值,支持二进制文本。在C#6.0中仍然不支持它,对吗?无法在vs2015中使用二进制文字:/uCK。为什么不直接使用枚举?用千表示1-0-0-0只是自找麻烦。@ColeJohnson:许多开发人员更喜欢这样。我不象某些开发人员那样擅长在头脑中转换十六进制,有时最好是满足最低公分母的要求。我认为这是最有效的方法,因为枚举是作为常量构建的。通过可选的[Flags]属性,它们可以用于按位操作(与问题没有直接关系,但在描述二进制文字时特别有用)。另一个有趣的可能性是强制将枚举类型作为内置类型(在本例中,在“天”之后添加“:byte”);请参阅中的内置类型,它实际上非常易于阅读,尽管在枚举上声明0标志相当糟糕practice@MikeT:你能详细说明(或提供一个链接详细说明)最后的想法吗?我经常声明以“1”开头的枚举,因为我希望在值从未初始化时能够声明。但在某些情况下,默认情况
int myValue = 0b0010_0110_0000_0011;
int x           = 0b10___10_0__________________00; //binary value of 80
int SeventyFive = 0B100_________1011; //binary value of 75

WriteLine($" {x} \n {SeventyFive}");
int x           = 0b1010000; //binary value of 80
int SeventyFive = 0B1001011; //binary value of 75

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