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#按位操作.
这是一个日常的按位操作技巧,没有多少人发现:
如果您有一个表示位域的枚举类型,则需要将每个枚举条目定义为不同的位值,如下所示:
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)
另一种典型的(但我认为不太常见)用法是将几个数字组合成一个大数字.一个例子可以是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值.
| 归档时间: |
|
| 查看次数: |
9196 次 |
| 最近记录: |