这是单独的一块,因为一条讲不清楚(虽然内容也不够一篇),而且我之前也没好好弄清楚,所以有必要写出来。
说位运算符也是从&与&&(|与||类似)之间的区别讲起的。事实上,对于两个布尔值的逻辑与(AND)运算,&与&&的结果完全相同,但是&&的性能会比较好,因为&&具有短路功能。即A&B是将两个A与B的值算出来后,返回这一结果,而具有短路功能的&&只要A为false就判定A&&B的结果为false。比如,有一个user对象时,
1 if(user != null && String.IsNullOrEmpty(user.Name)) 2 { 3 ; 4 }
上面这种,user == null的时候,if就进不去了,而用
if(user != null & String.IsNullOrEmpty(user.Name)) { ; }
就会抛异常NullReferenceException,未将对象引用到实例。
讲完了&作为布尔运算符与&&的区别,再就是&作为位运算符了。位运算符处理的是变量中存储的一系列位。包括有&、|、~、>>、<<五种,分别是按位与、按位或、按位取反、右移位、左移位。意思已经很明确,不在多言。另外,因为数值的类型都是定长的所以进位就没了,移出去的位也没了。
要多说一句的是,由于底层的结构限制,再结合原码、反码、补码这些,在int下,会有~1=-2的结果。因为1的原码是00000000000000000000000000000001,~1按位取反的结果是11111111111111111111111111111110,int是有符号的,负数存的是补码。正数的原码、反码和补码是一样一样的,负数的原码第一位是符号位,后面二进制表示绝对值,反码是符号位不变,后面按位取反,补码等于反码加1。-2的原码是10000000000000000000000000000010,反码是11111111111111111111111111111101,补码是11111111111111111111111111111110,对于int类型的字面值1和-2,我们有~1=-2成立。
总的来说还是挺清楚的一些事。