波形符在表达式中意味着什么?

Ult*_*nks 29 c# syntax

可能重复:
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

  • 该示例不正确,因为前导零也被反转.即`~31 = ~0x0000001F = 0xFFFFFFE0` (10认同)
  • 这个例子不正确31的二进制补码二进制是00000000000000000000000000011111(十六进制为0000001F - 如果正在计算32位)和"〜"运算符翻转位,所以答案将是11111111111111111111111111100000,如果我们将其转换为十进制,则回答是 - 32如果64位,31的二进制补码二进制为00000000000000000000000000000000000000000000000000000000000001111111并且"〜"翻转这些位,这相当于-32.AFAIK没有运行C#的6bit PC,这就是为什么你的错了.如果有一台6位PC,这是正确的. (3认同)

Dav*_*nan 25

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


Ode*_*ded 7

它是按位补码运算符.

基本上,它翻转位:

0xffff0000 == ~0x0000ffff
Run Code Online (Sandbox Code Playgroud)

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


Nic*_*rey 6

您可以使用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.按位补充0x0000001F0xFFFFFFE0.为什么他们不会只是写他们想要的实际面具超出我.