【问题标题】:What does the tilde mean in an expression? [duplicate]表达式中的波浪号是什么意思? [复制]
【发布时间】:2011-11-02 20:35:14
【问题描述】:

可能重复:
What is the tilde (~) in a C# enumeration?

我在this MSDN 页面上找到了以下代码。

(((Width * Planes * BitCount + 31) & ~31) / 8) * abs(Height)

这确实在 C# Visual Studio 2010 中编译。数字 31 前面的波浪号“~”到底是做什么的?我以前从未在表达式中看到过这种语法。

【问题讨论】:

  • 它是按位补码。请参阅以下链接。 【按位补码运算符是如何工作的】[1] [1]:*.com/questions/791328/…
  • 对于未来的参考,这里是 c# 运算符的列表。 C# Operators

标签: c# syntax


【解决方案1】:

~ - bitwise NOT operator,基本上是反转位

二进制格式的 31 是 11111,所以 ~31 == 11111111111111111111111111100000,或十六进制的 0xFFFFFFE0。

【讨论】:

  • +1,因为这是最容易理解和最清晰的答案。
  • 这个例子是不正确的,因为前导零也被反转了。 IE。 ~31 = ~0x0000001F = 0xFFFFFFE0
  • 此示例不正确 31 的二进制补码为 000000000000000000000000000011111 (十六进制为 0000001F - 如果正在计算 32 位)并且“~”运算符翻转位,因此答案将为 11111111111111101011111111111将其转换为十进制,答案为 -32 如果 64 位,则 31 的二进制补码为 000000000000000000000000000000000000000000000000000000000000011111 和“〜”翻转位,这再次相当于 -32。 AFAIK 没有运行 C# 的 6 位 PC,这就是为什么你的错误。如果有 6 位 PC,这是正确的。
【解决方案2】:

bitwise complement 运算符,也称为按位否定。

【讨论】:

    【解决方案3】:

    bitwise complement operator

    基本上,它会翻转位:

    0xffff0000 == ~0x0000ffff
    

    在您发布的代码中,执行& ~31 可确保最后 5 位为 0(按位和 11111 的补码为 00000)。

    【讨论】:

      【解决方案4】:

      你翻到你方便的ISO/IEC 23270:2006 — Information technology — Programming languages — C# 副本,然后翻到圣书的§14.6.4。在那里你会发现:


      14.6.4 位补运算符

      对于 ~x 形式的操作,应用一元运算符重载决议(第 14.2.3 节)来选择特定的运算符实现。操作数转换为所选运算符的参数类型,结果的类型为运算符的返回类型。预定义的按位补码运算符有:

      int   operator ~( int   x ) ;
      uint  operator ~( uint  x ) ;
      long  operator ~( long  x ) ;
      ulong operator ~( ulong x ) ;
      

      对于这些运算符中的每一个,运算的结果是 x 的按位补码。

      每个枚举类型 E 都隐含地提供以下按位补码运算符:

      E operator ~(E x);
      

      计算~x(其中x 是枚举类型E 和底层类型U 的表达式)的结果与计算unchecked((E)(~(U)x)) 完全相同。仅当操作数类型为枚举类型 E(第 14.2.3 节)时,一元运算符重载决策才会考虑此运算符。

      上面定义的未提升预定义按位补码运算符的提升(第 14.2.7 节)形式也是预定义的。


      在您的情况下,~31~ 0x0000001F 相同。 0x0000001F 的按位补码是 0xFFFFFFE0。为什么他们不会只写他们想要的实际面具,这超出了我的理解。

      【讨论】:

        【解决方案5】:

        这是按位补码运算符 - 它只是将所有 0 位变为 1,反之亦然...参见 MSDN reference

        在您的具体情况下,它只会创建 (31 = 0x1F):

        ~0x1F = 0xFFFFFFE0
        

        它与bitwise and (&) 一起使用,因此它基本上抵消了最后 5 位。

        【讨论】:

          【解决方案6】:

          ~31 = 31 的按位否定,在这种特殊情况下,用于将(Width * Planes * BitCount + 31) 的第一个(来自 LSB)5 位保持为零

          【讨论】:

            最近更新 更多