[转]C#枚举运算使用技巧 ----- 转自: http://hi.baidu.com/meback/item/e8cb68a4766bb2db5af1917d
C#枚举运算使用技巧
位运算符:& (按位与)、| (按位或)、^ (按位异或)、~ (按位取反)、>> (按位右移)、<< (按位左移)。
& ( 按位与): 概念上来讲就是二进制上按每一位(0或1)进行与运算。 那么与运算是什么意思该不用我说吧,就是两者都是1结果为真。其中一个为0结果为假。这里不可能有0、1之外的数,这里是二进制。先看一个8位二进制的例子:
7 & 8 = 0000 0 111 & 0000 1000 = 0000 0000 = 0
7 & 3 = 0000 0111 & 0000 0011 = 0000 0011 = 3
很简单吧。不用多说了,就是操作0和1。
^( 按位异或): 概念上来讲就是二进制上按每一位(0或1)进行异或运算。 异或运算简单讲就是相同就为假,不同为真。
7 ^ 3 = 0000 0111 ^ 0000 0011 = 0000 0100 = 4
>>( 按位右移): 概念上来讲就是二进制上按每一位(0或1)进行右移运算。 右移运算简单讲就是将二进制的位整体向右移动。
7 >> 2 = 0000 0111 >> 2 = 0000 0001 = 1 // 这里向右移动了2位,最低位的两个1被抹去。
这里右移两位等于除了2的2次方,7/4 = 1 在整数除法中则看成是被舍掉了小数部分。
<<( 按位左移): 这个就不说了,与上面右移方向的相反。
左移两位等于乘以2的2次方 7<<2 = 28;
对一个枚举进行加,减,是否存在操作:
比如我有一个枚举是这样:
public enum ReadEnum
{
Add = 1,
Update = 2,
Delete = 4,
Select = 8,
All = Add | Update | Delete | Select
}
枚举删除操作:
ReadEnum RemoveOne(ReadEnum itemNeedRemove, ReadEnum removeItem)
{
return itemNeedRemove & (ReadEnum.All ^ removeItem);
}
是否存在一个枚举操作:
bool IsHaveOne(ReadEnum itemNeedAdd, ReadEnum item)
{
return (itemNeedAdd & item) == item;
}
增加一个枚举操作:
ReadEnum AddOne(ReadEnum itemNeedAdd, ReadEnum addItem)
{
return itemNeedAdd | addItem;
}
当时学C语言时都很精通,现在都要忘了,在这里记下。
~( 按位取反): 概念上来讲就是二进制上按每一位(0或1)进行取反运算。 取反运算简单讲就是0变1,1变0。
~7 = ~0000 0111 = 1111 1 000 = 0xf8 = 248 (无符号)
7 | 8 = 0000 0 111 | 0000 1000 = 0000 1111 = 15
7 | 3 = 0000 0111 | 0000 0011 = 0000 0111 = 7
| ( 按位或): 概念上来讲就是二进制上按每一位(0或1)进行或运算。 那么或运算是什么意思该不用我说吧,就是两者都是0结果为假。其它情况都为真。
浙公网安备 33010602011771号