波形符在表达式中意味着什么?

时间:2011-11-02 20:35:14

标签: c# syntax

  

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

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

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

这确实在C#visual studio 2010中编译。在数字31前面,代字号“〜”究竟是什么?我以前从未在表达式中看到过这种语法。

6 个答案:

答案 0 :(得分:45)

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

二进制格式的31是11111,所以~31 == 00000,基本上是0

答案 1 :(得分:21)

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

答案 2 :(得分:6)

你转向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的表达式,与评估{{1}完全相同}}。当操作数类型为枚举类型unchecked((E)(~(U)x))(第14.2.3节)时,此运算符仅由一元运算符重载决策考虑。

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


在您的情况下,E~31相同。 ~ 0x0000001F的按位完整符为0x0000001F。为什么他们不会只是写出他们想要的实际面具超出我的范围。

答案 3 :(得分:5)

这是bitwise complement operator

基本上,它会翻转位:

0xffff0000 == ~0x0000ffff

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

答案 4 :(得分:1)

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

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

~0x1F = 0xFFFFFFE0

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

答案 5 :(得分:0)

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