日期:2014-05-18  浏览次数:20796 次

Keys位运算疑问。
Keys枚举的int值,并未按照位运算的分布来赋值,
比如:0,1,2,4,8

System.Windows.Forms.Keys.Control = 131072
System.Windows.Forms.Keys.D = 68
System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.D = 131072 + 68 = 131140

数学基础不好,对这个充满疑问
请教两点:
1.10进制或运算的结果,是否类同于加法?
2.如何将一个值,拆分出相应的Keys?

------解决方案--------------------
这种用法一般是2的倍数才行,2|4=6,那么6^2=4,你找几个简单点的数试试就清楚了
------解决方案--------------------
用Reflector取反编译.net,你可以在其中看看微软自身关于这些的很多用法的源码
------解决方案--------------------
1、不是加法,比如 3 | 1 = 3,不是4;
2、取该值的两个低位,或者假设值为x,取x & 0x0000ffff
------解决方案--------------------
无非就是如下:
void SetFlag(bool value, int bit, int number)
{
if (value) number = number | (1 << bit) / 2;
else number = number & ~((1 << bit) / 2);
}
bool GetFlag(int bit, int number)
{
return number & (1 << bit) / 2 == number;
}