使用按位运算符

con*_*att 3 c# bit-manipulation

我一直在学习C#,并且从我在C++中的旧工作中得到了一些熟悉的基础.我从未理解实际应用程序中按位运算符的原因.我从来没有使用它们,也没有理由使用它们.我一直在研究它们是如何工作的; 下面的示例显示了移位按位运算符.按位运算符,它们的使用以及它们如何工作有什么意义?

也许我错过了按位逻辑的东西.

byte bitComp = 15;              // bitComp = 15 = 00001111b
byte bresult = (byte) ~bitComp; // bresult = 240 = 11110000b
Run Code Online (Sandbox Code Playgroud)

这是〜补充按位运算符的示例:

byte bitComp = 15;              // bitComp = 15 = 00001111b
byte bresult = (byte) ~bitComp; // bresult = 240 = 11110000b
Run Code Online (Sandbox Code Playgroud)

Mit*_*eat 17

典型的用法是操纵代表互斥"标志"的位.

MSDN示例:枚举类型

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}

class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;

    Days2 notWednesday = ~(Days2.Wednesday);
}
Run Code Online (Sandbox Code Playgroud)

另请参阅Stack Overflow问题最常见的C#按位操作.


Jas*_*ams 8

这是一个日常的按位操作技巧,没有多少人发现:

如果您有一个表示位域的枚举类型,则需要将每个枚举条目定义为不同的位值,如下所示:

enum
{
    Option1 = 1,
    Option2 = 2,
    Option3 = 4,
    Option4 = 8,
    Option5 = 16
};
Run Code Online (Sandbox Code Playgroud)

但是很容易忘记序列中的下一个项目需要是最后一个数字的两倍.使用位移,使序列更容易正确:

enum
{
    Option1 = 1<<0,
    Option2 = 1<<1,
    Option3 = 1<<2,
    Option4 = 1<<3,
    Option5 = 1<<4
};
Run Code Online (Sandbox Code Playgroud)

  • 使用[Flags]属性更是如此.http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx (3认同)

era*_*ran 5

另一种典型的(但我认为不太常见)用法是将几个数字组合成一个大数字.一个例子可以是windows RGB宏:

#define RGB(r, g ,b)  ((DWORD) (((BYTE) (r) | ((WORD) (g) << 8)) | (((DWORD) (BYTE) (b)) << 16)))
Run Code Online (Sandbox Code Playgroud)

如果您取3个字节并从中组成一个整数,则表示RGB值.