这个位明智的操作在做什么?
What does this bit wise operation doing?
我读了很多关于按位运算的内容,但我仍然无法赋予这一行意义。
((text.flags & ~Text.BOLD) & ~Text.ITALIC) | Text.BOLD | Text.ITALIC
作者似乎是想确保此文本没有粗体和斜体样式,然后他将文本设为斜体和粗体。
我说得对吗,还是漏掉了一些细节?
不,你知道了; &
操作擦除 BOLD
和 ITALIC
位,而 |
操作设置它们。
它似乎正在关闭所有不是 BOLD
和 ITALIC
的标志(通过 &
和补码),然后确保 BOLD | ITALIC
已设置(通过 |
).
最终结果是,对于任何输入 text
,无论样式如何,输出都是 text
可以重写为
int bold_italic = Text.BOLD | Text.ITALIC;
text.flags = (text.flags & ~bold_italic) | bold_italic;
让我们从 4 位标志开始。
BOLD = 0001;
ITALIC = 0010
flags & ~BOLD =
flags & ~0001 =
flags & 1110 = clear BOLD flag.
flags | ITALIC =
flags | 0010 =
flags | 0010 = set ITALIC flag
我读了很多关于按位运算的内容,但我仍然无法赋予这一行意义。
((text.flags & ~Text.BOLD) & ~Text.ITALIC) | Text.BOLD | Text.ITALIC
作者似乎是想确保此文本没有粗体和斜体样式,然后他将文本设为斜体和粗体。
我说得对吗,还是漏掉了一些细节?
不,你知道了; &
操作擦除 BOLD
和 ITALIC
位,而 |
操作设置它们。
它似乎正在关闭所有不是 BOLD
和 ITALIC
的标志(通过 &
和补码),然后确保 BOLD | ITALIC
已设置(通过 |
).
最终结果是,对于任何输入 text
,无论样式如何,输出都是 text
可以重写为
int bold_italic = Text.BOLD | Text.ITALIC;
text.flags = (text.flags & ~bold_italic) | bold_italic;
让我们从 4 位标志开始。
BOLD = 0001;
ITALIC = 0010
flags & ~BOLD =
flags & ~0001 =
flags & 1110 = clear BOLD flag.
flags | ITALIC =
flags | 0010 =
flags | 0010 = set ITALIC flag