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

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


当前回答

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

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

long bitMask = 1011001;

后来

int bit5 = BitField。GetBit(位掩码,5);

Or

bool flag5 = BitField。GetFlag(位掩码,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;
    }
}

其他回答

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

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

long bitMask = 1011001;

后来

int bit5 = BitField。GetBit(位掩码,5);

Or

bool flag5 = BitField。GetFlag(位掩码,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;
    }
}

你总是可以创建准字面量,包含你想要的值的常量:

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

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

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

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

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

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

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

要解析,你可以使用:

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

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