(与运算)、(或运算)、^(异或运算)按位与运算符(&)
参加运算的两个数据,按⼆进制位进⾏“与”运算。
运算规则:0&0=0;  0&1=0;  1&0=0;    1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
例如:3&5  即 0000 0011& 0000 0101 = 00000001  因此,3&5的值得1。
另,负数按补码形式参加按位与运算。
“与运算”的特殊⽤途:
(1)清零。如果想将⼀个单元清零,即使其全部⼆进制位为0,只要与⼀个各位都为零的数值相与,结果为零。
(2)取⼀个数中指定位
⽅法:⼀个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进⾏“与运算”可以得到X中的指定位。例:设X=10101110,
writeline方法的作用
取X的低4位,⽤ X & 0000 1111 = 00001110 即可得到;
还可⽤来取X的2、4、6位。
按位或运算符(|)
参加运算的两个对象,按⼆进制位进⾏“或”运算。
运算规则:0|0=0;  0|1=1;  1|0=1;  1|1=1;
即:参加运算的两个对象只要有⼀个为1,其值为1。
例如:3|5 即 00000011 | 0000 0101 = 00000111  因此,3|5的值得7。 
另,负数按补码形式参加按位或运算。
“或运算”特殊作⽤:
(1)常⽤来对⼀个数据的某些位置1。
⽅法:到⼀个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。
例:将X=10100000的低4位置1 ,⽤X | 0000 1111 = 1010 1111即可得到。
异或运算符(^)
参加运算的两个数据,按⼆进制位进⾏“异或”运算。
运算规则:0^0=0;  0^1=1;  1^0=1;  1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
“异或运算”的特殊作⽤:
(1)使特定位翻转⼀个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。例:X=10101110,使X低4位翻转,⽤X ^0000 1111 = 1010 0001即可得到。
(2)与0相异或,保留原值,X ^ 00000000 = 1010 1110。
从上⾯的例题可以清楚的看到这⼀点。
取反运算符(~)
参加运算的⼀个数据,按⼆进制位进⾏“取反”运算。
运算规则:~1=0;  ~0=1;
即:对⼀个⼆进制数按位取反,即将0变1,1变0。
使⼀个数的最低位为零,可以表⽰为:a&~1。
~1的值为1111111111111110,再按“与”运算,最低位⼀定为0。因为“~”运算符的优先级⽐算术运算符、关系运算符、逻辑运算符和其他运算符都⾼。
左移运算符(<<)
将⼀个运算对象的各⼆进制位全部左移若⼲位(左边的⼆进制位丢弃,右边补0)。
例:a = a<< 2将a的⼆进制位左移2位,右补0,
左移1位后a = a *2;
若左移时舍弃的⾼位不包含1,则每左移⼀位,相当于该数乘以2。
右移运算符(>>)
将⼀个数的各⼆进制位全部右移若⼲位,正数左补0,负数左补1,右边丢弃。
操作数每右移⼀位,相当于该数除以2。
例如:a = a>> 2 将a的⼆进制位右移2位,
左补0 or 补1得看被移数是正还是负。
>> 运算符把expression1的所有位向右移expression2指定的位数。expression1的符号位被⽤来填充右移后左边空出来的位。向右移出的位被丢弃。
例如,下⾯的代码被求值后,temp的值是 -4:
-14 (即⼆进制的 11110010)右移两位等于 -4(即⼆进制的 11111100)。
var temp = -14 >> 2
⽆符号右移运算符(>>>)
>>>运算符把expression1的各个位向右移expression2指定的位数。右移后左边空出的位⽤零来填充。移出右边的位被丢弃。
例如:var temp = -14 >>>2
变量temp的值为 -14 (即⼆进制的 11111111 11111111 1111111111110010),向右移两位后等于 1073741820 (即⼆进制的 00111111 11111111 1111111111111100)。
复合赋值运算符
位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:
&=  例:a &=b      相当于a=a& b
|=  例:a |=b      相当于a=a |b
>>=  例:a >>=b      相当于a=a>> b
<<= 例:a<<=b      相当于a=a<< b
^=  例:a ^= b      相当于a=a^ b
运算规则:和前⾯讲的复合赋值运算符的运算规则相似。
不同长度的数据进⾏位运算
如果两个不同长度的数据进⾏位运算时,系统会将⼆者按右端对齐,然后进⾏位运算。
以“与”运算为例说明如下:我们知道在C语⾔中long型占4个字节,int型占2个字节,如果⼀个long型数据与⼀个int型数据进⾏“与”运算,右端对齐后,左边不⾜的位依下⾯三种情况补⾜,
(1)如果整型数据为正数,左边补16个0。
(2)如果整型数据为负数,左边补16个1。
(3)如果整形数据为⽆符号数,左边也补16个0。
如:long a=123;int b=1;计算a& b。
如:long a=123;int b=-1;计算a& b。
如:long a=123;unsigned intb=1;计算a & b
&:按位与,对两个条件都进⾏判断
&&:逻辑与,只要⼀个条件满⾜,另外⼀个条件就不会执⾏
同理:
|:按位或,对两个条件都进⾏判断
||:逻辑或,只要⼀个条件满⾜,另外⼀个条件就不会执⾏
上代码:
1//&与&&的测试
2public static bool oneMethod()
3        {
4            Console.WriteLine("这是第⼀个⽅法");
5return false;
6        }
7public static bool twoMethod()
8        {
9            Console.WriteLine("这是第⼆个⽅法");
10return false;
11        }
12//执⾏
13  Console.WriteLine("&符号的执⾏结果");
14            Console.WriteLine("输⼊这两个⽅法的结果{0}",oneMethod()&twoMethod());
15            Console.WriteLine("******************************************");
16            Console.WriteLine("&&符号的执⾏结果");
17            Console.WriteLine("输⼊这两个⽅法的结果{0}", oneMethod() && twoMethod());
// |与||的测试
public static bool oneMethod()
{
Console.WriteLine("这是第⼀个⽅法");
return true;
}
public static bool twoMethod()
{
Console.WriteLine("这是第⼆个⽅法");
return true;
}
//调⽤
Console.WriteLine("|符号的执⾏结果");
Console.WriteLine("输⼊这两个⽅法的结果{0}",oneMethod() | twoMethod());            Console.WriteLine("******************************************");
Console.WriteLine("||符号的执⾏结果");
Console.WriteLine("输⼊这两个⽅法的结果{0}", oneMethod() || twoMethod());

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。