区别!和〜在c#

时间:2014-01-15 09:55:52

标签: c# bitwise-operators logical-operators

当我第一次学习如何编写程序时,我使用了C.(非常基本的命令行应用程序) 在这两种语言中你都使用! - 操作员通常喜欢这样:

    if(!true){
       //false..
}

我想在c#中做一些比特掩码,我想知道'〜'运算符。

现在我有点困惑,因为在我自己的理解中!和〜应该做同样的事情。

这适用于c#:

int i = ~0xffffffff; // i = 0
bool j = !true; // j = false

这不是:(但它确实在c中起作用并且完全符合我的预期)

int i = !0xffffffff; // i = 0

那么〜和之间的差异是什么?他们为什么把他们分开?

3 个答案:

答案 0 :(得分:42)

C#决定将整数运算与布尔运算完全分开。例如,您不能if(x & 4)执行if((x & 4) != 0)以明确地从整数移动到布尔值。

这符合C及其前身40多年的经验,其中人们经常犯错误,例如两个值为true且得{{}}的值。 1}}因为虽然它们都是非零的,但它们没有共同的非零位。

C和C ++都在其历史的后期引入了false类型,以在表示数字或位模式的整数与我们只关心真值的值之间添加更明确的差异,但不得不与旧代码兼容。 C#有更明确的奢侈品。

考虑到这一点,C#的bool!与C完全相同,只是有些事情不再有意义:

在C ~否定真值。它将0(假)变为1(真),并将所有非零(真)变为0(假)。在C#中仅对!有意义,而不是bool

在C int中产生一个补语;它产生一个值,其中每1位变为0并且每0位变为1(例如0xFFFFFFFF变为0,0xF0F0F0F0变为0x0F0F0F0F,依此类推)。在C#中,~有意义,但int没有。

如果您想在C#中执行相当于bool的操作,请执行!someInteger

编辑:

值得注意的是,操作员被分成“按位”('&','|'和'〜')和“boolean”('&&','| |'和'!')。这种区别并不完全正确。

现在,最后三个确实只在布尔上下文中有意义,因此C#在布尔值和整数值之间有更严格的分离,它们不再应用于整数。

'〜'在布尔上下文中确实没有意义('~x',其中'x'为真将生成'x'仍为真,4294967295中有4294967294次),因此使用C#不再是适用于bools。

'&安培;'和'|'保留一个布尔用途。在“A()”和“B()”各自返回someInteger == 0的情况下,bool只有在A() && B()为假({1}}时才会调用B() ,它“短路”),A()将始终调用两个方法,然后再进行A() & B()布尔算术。这往往很少见,因为:

  1. 大部分时间拨打只是浪费时间,短路可以给我们带来性能提升,从大量(如果B()昂贵)到制作 - 没有差别,但我们没有丢失任何东西,所以这是习惯。(但考虑到如果B()非常便宜,无论如何调用它的成本可能比它更便宜分支,特别是如果误预测,请参见下面的评论。)

  2. 有时B()是强制性的,例如在&&中,不会短路会在第二个参数上引发异常。

  3. 如果要确保调用这两个方法非常重要,那么在单独的语句中进行更好的编码是为了让其他开发人员(或者您以后再来的时候)明白这一点。

  4. 但是如果我们要讨论使用布尔和整数参数的运算符之间的区别,我们应该包括x != null && x.Length != 0|的布尔值使用,因为它们确实出现了(有时通过拼写错误!),如果人们错误地将“按位运算符”和“布尔运算符”分开并忘记有两个符号同时用作两者,它们会引起混淆。

答案 1 :(得分:16)

!是一个布尔反转,它将值从true反转为false,反之亦然。 http://msdn.microsoft.com/en-us/library/f2kd6eb2.aspx

~是一个按位反转,它反转整数值的每一位,如int ihttp://msdn.microsoft.com/en-us/library/d2bd4x66.aspx

http://msdn.microsoft.com/en-us/library/6a71f45d.aspx 获取所有运营商的完整指南。

!~分开的原因是因为他们做了不同的事情。

答案 2 :(得分:2)

~按位NOT运算符是一元运算符,因为它包含单个操作数。与其他按位运算符不同,按位版本不使用与类似布尔运算符相同的符号。为了实现一个补码,波形符(〜)位于要修改的值的左侧。

byte valueToComplement = 187;                  // 10111011  
byte complement = (byte) ~valueToComplement;   // Result = 68

! - 是一个布尔反转,可以是true或false。