我有以下代码
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);
我知道这段代码,但我不知道这些符号是什么意思&,|和〜。
是这些意思(和,或,不)或我错了吗?
答案 0 :(得分:1)
是,
检查这些链接以获取说明。
答案 1 :(得分:1)
它们是按位操作。 |
是OR &
是AND,~
不是。
您正在比较枚举的标志,因此每个(Style
,Bold
等)都是一个2的幂。使用标志进行位操作的魔力就是两个标志的按位OR将设置两个位。通过使用位掩码,有人可以确定您在一起使用哪些值,或者是否使用了特定的“枚举”。
第一行是要求将Style
设置为true并且不是Bold
的字体。
第二种是寻找Style
或Bold
。
答案 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
}