可能重复:
C#枚举中的波浪号(〜)是多少?
我在这个 MSDN页面上找到了以下代码.
(((Width * Planes * BitCount + 31) & ~31) / 8) * abs(Height)
Run Code Online (Sandbox Code Playgroud)
这确实可以在C#visual studio 2010中编译.在数字31前面,代字号"〜"究竟是什么?我以前从未在表达式中看到过这种语法.
sll*_*sll 49
~- 按位NOT运算符,基本上反转位
31的二进制格式是11111,所以~31 == 00000,基本上是0
它是按位补码运算符.
基本上,它翻转位:
0xffff0000 == ~0x0000ffff
Run Code Online (Sandbox Code Playgroud)
在您发布的代码中,& ~31确保最后5位为0(按位和11111的补码为00000).
您可以使用ISO/IEC 23270:2006的便利副本- 信息技术 - 编程语言 - 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 ) ;
Run Code Online (Sandbox Code Playgroud)
对于这些运算符中的每一个,运算的结果是x的按位补码.
每个枚举类型E隐式提供以下按位补码运算符:
E operator ~(E x);
Run Code Online (Sandbox Code Playgroud)
评估的结果~x,其中x是具有E基础类型的枚举类型的表达式,与U评估完全相同unchecked((E)(~(U)x)).当操作数类型为枚举类型E(第14.2.3节)时,此运算符仅由一元运算符重载决策考虑.
上面定义的未提升的预定义位运补码运算符的提升(第14.2.7节)形式也是预定义的.
在你的情况下~31是相同的~ 0x0000001F.按位补充0x0000001F是0xFFFFFFE0.为什么他们不会只是写他们想要的实际面具超出我.