我在this MSDN页面上找到了以下代码。
(((Width * Planes * BitCount + 31) & ~31) / 8) * abs(Height)
这确实在C#visual studio 2010中编译。在数字31前面,代字号“〜”究竟是什么?我以前从未在表达式中看到过这种语法。
答案 0 :(得分:45)
~
- bitwise NOT operator,基本上反转位
答案 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)保持为零