可能是重复问题:
C#枚举中的波浪号(~)是什么?
我在这个MSDN页面上找到了以下代码片段。
(((Width * Planes * BitCount + 31) & ~31) / 8) * abs(Height)
在C# Visual Studio 2010中确实可以编译此代码。请问数字31前面的波浪线"~"具体是做什么用的?我以前从未在表达式中见过这种语法。
可能是重复问题:
C#枚举中的波浪号(~)是什么?
我在这个MSDN页面上找到了以下代码片段。
(((Width * Planes * BitCount + 31) & ~31) / 8) * abs(Height)
在C# Visual Studio 2010中确实可以编译此代码。请问数字31前面的波浪线"~"具体是做什么用的?我以前从未在表达式中见过这种语法。
~
- 按位取反运算符, 基本上是反转二进制位。
31 的二进制格式是 11111,所以 ~31 == 11111111111111111111111111100000,或者是 0xFFFFFFE0 十六进制。
~31 = ~0x0000001F = 0xFFFFFFE0
。 - JimiLoe14.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
是具有基础类型U
的枚举类型E
的表达式时,~x
的结果与评估unchecked((E)(~(U)x))
完全相同。只有当操作数类型是枚举类型E
(§14.2.3)时,该运算符才会被一元运算符重载解析器考虑。~31
等同于 ~ 0x0000001F
。 0x0000001F
的按位补数是 0xFFFFFFE0
。为什么他们不直接写出他们想要的实际掩码,这超出了我的理解范围。这是按位取反运算符 - 它将所有的0位变成1,反之亦然... 详见MSDN参考。
在你的特定情况下它只会创建 (31 = 0x1F
):
~0x1F = 0xFFFFFFE0
它与 按位与 (&)
一起使用,因此基本上它会取消掉最后5位。
~31 = 对31进行按位取反,这里特别用于将(Width * Planes * BitCount + 31)
的前5位(从LSB开始)保持为零。