Rocho.J

人脑是不可靠的, 随时记录感悟并且经常重复!

 

[转]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结果为假。其它情况都为真。

posted on 2014-01-01 18:40  RJ  阅读(297)  评论(0)    收藏  举报

导航