c#十六进制&比较
本文关键字:比较 十六进制 | 更新日期: 2023-09-27 18:11:26
我遇到了一点代码类似于下面的代码,只是好奇如果有人能帮助我了解它在做什么?:
int flag = 5;
Console.WriteLine(0x0E & flag);
// 5 returns 4, 6 returns 4, 7 returns 6, 8 returns 8
沙箱:https://dotnetfiddle.net/NnLyvJ
这是位与运算符。它对数字的位进行与运算。
一个逻辑 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
。
c#使用enum
和Flags
属性提供了一种"更干净"的方法来完成此操作。
[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"
}
请原谅我的英语不好