理解非布尔参数之间的按位比较
本文关键字:比较 之间 参数 布尔 | 更新日期: 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.Style
是Bold too
后面是
controlToUpdate.Font.Style ^
:位XOR
运算符,其中相同的值给出0
1 1 = 0
0 0 = 0
1 0 = 1
0 1 = 1
因此,考虑到之前的输出(假设它是Bold),结果将是false
或0
,因此常规字体样式。在实践中,这是一种强制规则类型字体的方法,独立于控件上的实际样式设置。