波浪号在表达式中意味着什么?

可能重复:
C#枚举中的波浪号(〜)是多少?

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

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

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

这是按位补码运算符,也称为按位求反。

~ – 按位NOT运算符 ,基本上反转位

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

您可以使用ISO / IEC 23270:2006的便捷副本- 信息技术 – 编程语言 – C#并转向神圣写作的§14.6.4。 在那里你会发现:


14.6.4按位补码运算符

对于~xforms的操作,应用一元运算符重载决策(第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是具有基础类型U的枚举类型E的表达式,与评估unchecked((E)(~(U)x))完全相同。 当操作数类型为枚举类型E (第14.2.3节)时,此运算符仅由一元运算符重载决策考虑。

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


在你的情况下, ~31~ 0x0000001F相同。 0x0000001F的按位完成为0xFFFFFFE0 。 为什么他们不会只是写他们想要的实际面具超出我。

它是按位补码运算符 。

基本上,它翻转位:

 0xffff0000 == ~0x0000ffff 

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

这是按位补码运算符 – 它只是将所有0位变为1,反之亦然…参见MSDN参考 。

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

 ~0x1F = 0xFFFFFFE0 

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

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