C#十六进制&对照

时间:2016-10-04 18:36:05

标签: c# hex

我遇到了类似下面代码的一些代码,如果有人可以帮助我了解它在做什么,我感到很好奇:

int flag = 5;
Console.WriteLine(0x0E & flag);
// 5 returns 4, 6 returns 4, 7 returns 6, 8 returns 8

沙箱: https://dotnetfiddle.net/NnLyvJ

1 个答案:

答案 0 :(得分:2)

这是bitwise AND运算符。 它对数字的位执行AND运算。

对两个[boolean]值的逻辑 AND操作,如果两个值为True,则返回True;否则就错了。

对两个数字进行按位 AND操作会返回两个数字中所有位的数字,这两个数字在两个数字中都是1(True)。

示例:

5   = 101
4   = 100
AND = 100 = 4

因此,5 & 4 = 4。

这个逻辑大量用于存储标志,你只需要为每个标志分配2的幂(1,2,4,8等),这样每个标志都存储在标志号的不同位,并且然后你只需要flags & FLAG_VALUE,如果设置了标志,它将返回FLAG_VALUE,否则0

使用enumFlags属性,C#提供了一种“更干净”的方法。

[Flags]
public enum MyFlags
{
    Flag0 = 1 << 0, // using the bitwise shift operator to make it more readable
    Flag1 = 1 << 1,
    Flag2 = 1 << 2,
    Flag3 = 1 << 3,
}

void a()
{
    var flags = MyFlags.Flag0 | MyFlags.Flag1 | MyFlags.Flag3;
    Console.WriteLine(Convert.ToString((int) flags, 2)); // prints the binary representation of flags, that is "1011" (in base 10 it's 11)
    Console.WriteLine(flags); // as the enum has the Flags attribute, it prints "Flag0, Flag1, Flag3" instead of treating it as an invalid value and printing "11"
    Console.WriteLine(flags.HasFlag(MyFlags.Flag1)); // the Flags attribute also provides the HasFlag function, which is syntactic sugar for doing "(flags & MyFlags.Flag1) != 0"
}

请原谅我糟糕的英语。