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

我知道那个代码,但我不知道这些符号 &,| 是什么意思 和 ~ 。
这些意思是(和,或,不是)还是我错了?

4

7 回答 7

1

是的,

& 是逻辑和

| 是逻辑或

检查这些链接以获取描述。

单击此处查看所有 C# 运算符说明

于 2012-04-16T20:50:59.470 回答
1

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

您正在比较枚举的标志,因此每个(StyleBold等)都是一个数字,是 2 的幂。使用标志进行位操作的神奇之处在于,两个标志的按位或将设置两个位。通过使用位掩码,某人可以确定您将哪些值进行或运算,或者是否使用了特定的“枚举”。

第一行要求Style设置为 true AND 的字体不是Bold

第二个是寻找带有StyleOR的字体Bold

于 2012-04-16T20:51:47.973 回答
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
于 2012-04-16T20:59:35.657 回答
0

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

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

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

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

ORing 会将粗体枚举添加到您的样式中。

读一读,然后用一点纸弄清楚发生了什么,它非常聪明,而且这种编码到处都在使用。

于 2012-04-16T20:50:51.543 回答
0

它们是逻辑位运算符。

这:

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

采用旧字体样式并通过对除(按位否定)粗体之外的每一位执行按位与来删除粗体。

然而这:

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

正在设置由 FontStyle.Bold 表示的位。

于 2012-04-16T20:51:04.930 回答
0

这些是按位运算符:http: //msdn.microsoft.com/en-us/library/6a71f45d%28v=vs.71%29.aspx(“逻辑(布尔和按位)”行)

基本上,它们在位级别上工作。& 是与,| 是 OR,~ 不是。这是一个例子:

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

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

于 2012-04-16T20:53:04.783 回答
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
}
于 2012-04-16T20:55:56.330 回答