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

本文关键字:比较 之间 参数 布尔 | 更新日期: 2023-09-27 17:53:27

我正在处理一些旧代码,试图改进它,我遇到了以下问题,我很难理解:

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窗体时,这是正常的方式吗?我是这个领域的新手——对于在这个领域更有经验的程序员来说,这里的意图很明显吗?

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

controlToUpdate.Font.Style & FontStyle.Bold
如果样式(controlToUpdate.Font.Style)包含粗体,

执行"and"来返回FontStyle.Bold,如果样式不包含粗体,则返回0:基本上,它只获得"粗体"位。

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

执行"异"操作;如果设置了粗体位,则删除它;如果加粗位没有设置,则不执行任何操作(因为"xor"带0是无操作)。

所以基本上,复杂的代码只是删除了"粗体"位(如果它被设置)。更简单的实现是:
controlToUpdate.Font.Style & ~FontStyle.Bold

工作原理:这里,~FontStyle.Bold 反转所有位;FontStyle.Bold is 1:

000....000001

所以~FontStyle.Bold是:

111...1111110

然后用"and"表示当前样式,这意味着它保留了所有旧样式除了的粗体位。

FontStyle枚举是Flags枚举,使它们成为位图。

使用位操作符,可以让你找出哪些标志是"on","off",当然,还可以改变它们。

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

FontStyle.Bold | FontStyle.Italic

这是否正常,取决于这样做的原因是什么,但基本上这意味着:

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)将返回true,只有当controlToUpdate.Font.StyleBold too

后面是

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

1 1  = 0 
0 0  = 0
1 0  = 1 
0 1 =  1
因此,考虑到之前的输出(假设它是Bold),结果将是false0,因此常规字体样式。在实践中,这是一种强制规则类型字体的方法,独立于控件上的实际样式设置。