求一条语句的 正解~

lqkankan 2010-12-29 09:57:01

if ((options & ~(CompareOptions.StringSort | CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)) != CompareOptions.None)
{
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidFlag"), "options");
}


在看.net源码时 看到一个if条件语句的使用

想知道 if ((options & ~(CompareOptions.StringSort | CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)) != CompareOptions.None)

应该怎样理解 那个 & ~ | 都是怎么用的~

谢谢
...全文
111 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
rabbitlzx 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 rabbitlzx 的回复:]

C# code
if ((options & ~(CompareOptions.StringSort | CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)) != CompareOptions.None) { throw new ArgumentException(Environment.GetResourceString("Argument_InvalidFlag"), "options"); }

//和下面的等价
bool Condition1 = CompareOptions.StringSort | CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase;

bool Condition2 = options & ~Condition1;

bool Condition3 = Conditon2 != CompareOptions.None;

if (Condition3)
{ throw new ArgumentException(Environment.GetResourceString("Argument_InvalidFlag"), "options"); }

[/Quote]
上面代码的意思应该是: options的取值应该是CompareOptions.StringSort | CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase 或者CompareOptions.None中的任何一个,如果不是这些值中的任何一个则抛出异常
rabbitlzx 2010-12-29
  • 打赏
  • 举报
回复


bool Condition1 = CompareOptions.StringSort | CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase;

bool Condition2 = options & ~Condition1;

bool Condition3 = Conditon2 != CompareOptions.None;

if (Condition3)
...

luxiaodongly 2010-12-29
  • 打赏
  • 举报
回复
我想你程序应该是这样的
[Flags]
public enum CompareOptions
{
None = 1,
StringSort = 2,
IgnoreWidth = 4,
IgnoreKanaType = 8,
IgnoreSymbols = 16,
IgnoreNonSpace = 32,
IgnoreCase = 64,
}

你用这个语句进行调试
CompareOptions options = CompareOptions.None;
if ((options & ~(CompareOptions.StringSort | CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)) != CompareOptions.None)
{
MessageBox.Show(options.ToString());
}
上面的逻辑 应该可以写成 options != CompareOptions.None
不知道对不对。
通过修改不同的 options 值来判断
lqkankan 2010-12-29
  • 打赏
  • 举报
回复
求 求 求教啊~
lqkankan 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gt7466 的回复:]

C# code

int a=6&3;
Console.WriteLine("a={0}",a);
//6的二进制是00000110,3的二进制是00000011,按位与后等于00000010,即2
int c=~6;
Console.WriteLine("c={0}",c);
//6的二进制是00000110,按位取反后是11111001即-7
[/Quote]

if ((options & ~(CompareOptions.StringSort | CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase)) != CompareOptions.None)

帮我看看 这个应该怎么理解啊~

GT7466 2010-12-29
  • 打赏
  • 举报
回复

int a=6&3;
Console.WriteLine("a={0}",a);
//6的二进制是00000110,3的二进制是00000011,按位与后等于00000010,即2
int c=~6;
Console.WriteLine("c={0}",c);
//6的二进制是00000110,按位取反后是11111001即-7
lqkankan 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hitlcyu19 的回复:]

看看位运算
[/Quote]

看了不是很理解 才提问的~

-----------------------------------------

我大概理解的意思是 options &~(选项1 | 选项2 | ... | 选项N) 这些都不等于 后面的那个....

反正有点乱
  • 打赏
  • 举报
回复
&是二进制按位与运算符,~是二进制按位取反运算符。
hitlcyu19 2010-12-29
  • 打赏
  • 举报
回复
看看位运算

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧