2011-11-02 77 views
21

可能重复:
What is the tilde (~) in a C# enumeration?代字符在表达式中的含义是什么?

我发现下面的代码有点this MSDN页面上。

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

这实际上确实在C#visual studio 2010中进行了编译。究竟是在号码31前面的代字号“〜”是什么?我从来没有在表达式中看过这个语法。

+2

它的按位补充。请参阅下面的链接。 [如何进行按位补运算符工作] [1] [1]:http://stackoverflow.com/questions/791328/how-does-the-bitwise-complement-operator-work – Nerdtron

+0

对于未来的参考这里是c#操作符的列表。 [C#运营商](http://msdn.microsoft.com/en-us/library/6a71f45d.aspx) –

回答

5

这是bitwise complement operator

基本上,它翻转位:

0xffff0000 == ~0x0000ffff 

在代码您已发布,做& ~31确保最后5位是0(按位和11111的补体,其是00000的)。

36

~ - bitwise NOT operator,基本上以二进制格式位取反

31是11111,因此〜31 == 00000,基本为0

+0

+1,因为这是最容易理解和最清晰的答案。 –

+5

该示例不正确,因为前导零也被反转。即'〜31 =〜0x0000001F = 0xFFFFFFE0' – JimiLoe

+1

这个例子不正确 31的二进制补码是00000000000000000000000000011111(十六进制是0000001F - 如果计算32位)并且“〜”运算符翻转这些位,所以答案将是11111111111111111111111111100000如果我们将它转​​换为十进制,答案是-32 如果64,31的二进制补码是0000000000000000000000000000000000000000000000000000000000011111和“〜”翻转位,这又是等同于-32。 AFAIK没有运行C#的6位个人电脑,为什么你错了。 如果有6位PC,这是正确的。 –

1

这是按位补运算符 - 它只是使所有0位到1秒反之亦然......见MSDN reference

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

~0x1F = 0xFFFFFFE0 

它是用来与bitwise and (&)从而bascially它取消了最后5位。

0

〜31 = 31,在这种特定的情况下,按位否定是用来保持为零(Width * Planes * BitCount + 31)

7

第一(从LSB)的5位您谈谈您得心应手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表达式的结果,是完全一样评估unchecked((E)(~(U)x))。当操作数类型是枚举类型E(§14.2.3)时,此运算符仅由一元运算符重载分辨率考虑。

抬升(§14.2.7)上面定义的未提升预定按位求补运算符的形式也预先确定。


在你的情况~31是一样的~ 0x0000001F0x0000001F的按位成分是0xFFFFFFE0。为什么他们不会写出他们想要的真正的面具超出了我的想象。

相关问题