理解非布尔参数之间的按位比较

时间:2013-01-16 09:34:20

标签: c# winforms bit-manipulation bitwise-operators

我正在使用一些旧代码,尝试改进它,我遇到了以下内容,我无法理解:

controlToUpdate.Font = 
    new System.Drawing.Font(someFont,
                            someFontSize,
                            controlToUpdate.Font.Style ^ 
                                (controlToUpdate.Font.Style & FontStyle.Bold));

具体来说,我对最后一个参数的作用感到困惑。据我了解,以下内容应进行逐位比较,并返回结果:

controlToUpdate.Font.Style ^ (controlToUpdate.Font.Style & FontStyle.Bold)

..但这在这种情况下意味着什么?可能的结果是什么,可以作为第三个参数传递给new Font(...),我怎样才能更清楚地重写它,同时保持原始程序员的意图?

旁注:在使用Windows窗体时,这是否是正常的做法?我在这个领域有点新鲜 - 对于在这个领域更有经验的编码人员来说,这里的意图是否明显?

3 个答案:

答案 0 :(得分:3)

controlToUpdate.Font.Style & FontStyle.Bold

执行"和"如果样式(FontStyle.Bold)包含粗体,则返回controlToUpdate.Font.Style;如果样式不包含粗体,则返回0:基本上,它只获得"粗体"位。

controlToUpdate.Font.Style ^ (controlToUpdate.Font.Style & FontStyle.Bold)

执行" xor&#34 ;;如果设置了粗体位,则将其删除;如果粗体位设置,那么它什么都不做(因为" xor" 0是无操作)。

所以基本上,复杂的代码只是删除了"粗体"位(如果已设置)。一个更简单的实现应该是:

controlToUpdate.Font.Style & ~FontStyle.Bold

如何工作:在这里,~FontStyle.Bold 反转所有位; FontStyle.Bold1

000....000001

所以~FontStyle.Bold是:

111...1111110
然后我们"和"使用我们当前的样式,这意味着它将所有旧样式 除了 保留为粗体。

答案 1 :(得分:2)

FontStyle枚举是Flags枚举,使其成为bitmaps

使用按位运算符,可以找出“打开”,“关闭”的标志,当然还可以更改它们。

这很常见 - 例如,要查明样式是粗体还是斜体,您可以使用:

FontStyle.Bold | FontStyle.Italic

答案 2 :(得分:2)

如果这是正常的,取决于执行此操作的原因是什么,但基本上这意味着:

controlToUpdate.Font.Style ^ (controlToUpdate.Font.Style & FontStyle.Bold)

(controlToUpdate.Font.Style & FontStyle.Bold):按位AND,这样就足够了0,它会返回0(可以想象这就像乘法一样)

1 0 = 0
0 1 = 0 
1 1 = 1 
0 0 = 0

只有当(controlToUpdate.Font.Style & FontStyle.Bold) 粗体时,controlToUpdate.Font.Style才会返回true

之后

controlToUpdate.Font.Style ^:按位XOR运算符,其中相同的值为0

1 1  = 0 
0 0  = 0
1 0  = 1 
0 1 =  1

因此,考虑到之前的输出(比如 Bold ),结果将为false0,因此常规字体样式。

在实践中,这是一种隐藏 Regular 类型字体的方法,与控件上设置的真实样式无关。