当使用字体类时,这些符号(&〜|)是什么意思

时间:2012-04-16 20:47:41

标签: c#

我有以下代码

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);

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

7 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

它们是按位操作。 |是OR &是AND,~不是。

您正在比较枚举的标志,因此每个(StyleBold等)都是一个2的幂。使用标志进行位操作的魔力就是两个标志的按位OR将设置两个位。通过使用位掩码,有人可以确定您在一起使用哪些值,或者是否使用了特定的“枚举”。

第一行是要求将Style设置为true并且不是Bold的字体。

第二种是寻找StyleBold

的字体

答案 2 :(得分: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)

这意味着我们想要加粗字体。通过对存在值进行OR运算(这也意味着已经加粗的东西将保持粗体)。

(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

答案 3 :(得分:0)

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

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

具有从整体风格中删除粗体属性的效果(当我开始时,这些对我来说似乎总是有点倒退,不得不去除某些东西以摆脱它,但你会习惯它。)

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

ORing会为您的风格添加大胆的枚举。

做一些阅读,然后通过一些论文弄清楚发生了什么,它非常聪明,并且这种编码在整个地方都被使用。

答案 4 :(得分:0)

它们是逻辑按位运算符。

此:

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

采用旧的字体样式并通过执行按位AND来删除粗体,每个位除了(按位取反)粗体。

但是这个:

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

设置由FontStyle.Bold表示的位。

答案 5 :(得分:0)

那些是按位运算符:http://msdn.microsoft.com/en-us/library/6a71f45d%28v=vs.71%29.aspx(行“Logical(boolean and bitwise)”​​)

基本上,它们在位级别上工作。 &安培;是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)

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

答案 6 :(得分:0)

变量是bitflag枚举。所以你可以和它们一起使用按位AND运算符“$”或OR与它们一起使用按位OR运算符“|”。

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

[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
}