2012-04-16 48 views
3

我有以下代码这是什么意思这些符号(〜|)时,使用的字体类

Font oldf; 
Font newf; 

oldf = this.richText.SelectionFont; 

if (oldf.Bold) 
    newf = new Font(oldf, oldf.Style & ~FontStyle.Bold); 
else 
    newf = new Font(oldf, oldf.Style | FontStyle.Bold); 

我知道的代码,但我不知道这是什么意思这些符号&,|和〜。
是这些意思(和,或不,)或我​​错了吗?

回答

1

像其他人一样,他们是位运算符。 FontStyle是一个位域(一组标志)。


oldf.Style & ~FontStyle.Bold 

这意味着“去掉粗体”但看着下面的数学,你会得到这样的事情

(a) FontStyle.Bold = 0b00000010; // just a guess, it doesn't really matter 
(b) oldf.Style  = 0b11100111; // random mix here 
// we want Bold "unset" 
(c) ~FontStyle.Bold = 0b11111101; 
=> (b) & (c)  = 0b11100101; // oldf without Bold 

new Font(oldf, oldf.Style | FontStyle.Bold) 

这意味着我们要加粗的字体。通过将其与现有值进行或运算(这也意味着已经是大胆的东西将保持大胆)。

(a) FontStyle.Bold = 0b00000010; // just a guess, it doesn't really matter 
(b) oldf.Style  = 0b11100000; // random mix here 
=> (b) | (c)  = 0b11100010; // oldf with Bold 
0

你是对的,他们是逻辑按位运算符。

new Font(oldf, oldf.Style & ~FontStyle.Bold); 

已经从你的整体风格去掉粗体属性的效果(这些总是显得有点倒退到我,当我开始了,不必有所为摆脱它,但你会习惯它)。

new Font(oldf, oldf.Style | FontStyle.Bold); 

ORing将为您的样式添加粗体枚举。

做一些阅读,然后研究一下纸上发生了什么,这是非常聪明的,这种编码被用在所有的地方。

0

他们的逻辑位运算符。

此:

newf = new Font(oldf, oldf.Style & ~FontStyle.Bold); 

走的是老字号的风格,并通过执行的位与每一位EXCEPT(按位取反)大胆除去大胆。

然而这样的:

newf = new Font(oldf, oldf.Style | FontStyle.Bold); 

是通过设置代表FontStyle.Bold位。

1

它们是按位运算。 |是OR &是AND,而~不是。

您正在比较枚举的标志,所以其中的每一个(Style,Bold等)都是一个幂数为2的数字。使用诸如此类标志的位操作的神奇之处在于,两个标志的按位“或”将具有两个位。通过使用位掩码,人们可以计算出您与哪些值进行了或运算,或者是否使用了特定的“枚举”。

第一行是询问字体Style设置为true,那不是Bold。第二部分是StyleBold

0

这些都是按位运算符:http://msdn.microsoft.com/en-us/library/6a71f45d%28v=vs.71%29.aspx

基本上,他们对位水平的工作(行“逻辑(布尔和位)”)。 &是AND,|是OR,〜不是。这里有一个例子:

00000001b & 00000011b == 00000001b (any bits contained by both bytes) 
00000001b | 00001000b == 00001001b (any bits contained in either byte) 
~00000001b == 11111110b (toggle all bits) 

我在这里使用了单个字节,但它也适用于多字节值。

0

变量是位标记枚举。因此,您可以将它们与位运算符“$”一起使用,或者将它们与位运算符“|”一起进行或运算。

它们与枚举一起使用,因此允许您在下面指定多个选项示例。

[Flags] 
enum Numbers { 
    one = 1 // 001 
    two = 2 // 010 
    three = 4 // 100 
} 

var holder = Numbers.two | Numbers.one; //one | two == 011 

if ((holder & Numbers.one) == Numbers.one) { 
    //Hit 
} 

if ((holder & Numbers.two) == Numbers.two) { 
    //Hit 
} 

if ((holder & Numbers.three) == Numbers.three) { 
    //Not hit in this example 
}