【问题标题】:What does this bit wise operation doing?这个按位操作在做什么?
【发布时间】:2017-03-13 00:05:12
【问题描述】:

我读了很多关于按位运算的文章,但我仍然无法为这一行赋予意义。

((text.flags & ~Text.BOLD) & ~Text.ITALIC) | Text.BOLD | Text.ITALIC

似乎作者试图确保此文本没有样式 BOLD 和 ITALIC,然后他将文本设为 ITALIC 和 BOLD。

我是对的,还是遗漏了一些细节?

【问题讨论】:

    标签: bit-manipulation bitwise-operators bit-fields


    【解决方案1】:

    它似乎关闭了所有标志,而不是 BOLDITALIC(通过 & 和补码),然后确保设置了 BOLD | ITALIC(通过 |)。

    最终结果是,对于任何输入 text,无论样式如何,输出都是 text

    可以改写成

    int bold_italic = Text.BOLD | Text.ITALIC;
    text.flags = (text.flags & ~bold_italic) | bold_italic;
    

    【讨论】:

    • 因此,它会创建一个只有 BOLD 和 ITALIC 样式的文本。
    • 看起来是这样,是的。当然,你可以自己测试一下?
    • 或者你可以写text.flags |= bold_italic
    • @Paulpro 其他标志无论如何都没有关闭。 & ~bold_italics 关闭 bold_italics。相同的标志被关闭然后再次打开。如果这本身不能令人信服,here 是一步一步的证明
    • 另外,如果其他标志关闭,整个事情将简化为text.flags = bold_italic
    【解决方案2】:

    不,你明白了; & 操作正在擦除 BOLDITALIC 位,而 | 操作设置它们。

    【讨论】:

      【解决方案3】:

      让我们从 4 位标志开始。

      BOLD = 0001;ITALIC = 0010

      flags & ~BOLD =   
      flags & ~0001 = 
      flags & 1110 = clear BOLD flag.
      

      flags | ITALIC = 
      flags | 0010 = 
      flags | 0010 = set ITALIC flag
      

      【讨论】:

      • ~ 运算符实际上是补码而不是 NOT 运算符。很难听懂你的回答。
      • @AlwaysNewbie 这只是同一事物的不同名称
      猜你喜欢
      • 2013-04-29
      • 2023-03-21
      • 1970-01-01
      • 2018-10-24
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多