按位运算符,按位异或计算器
运算中涉及的两个数据根据二进制位是“与”。
运算规则:0 0=0;0 1=0;1 0=0;1 1=1;
即如果两位数都是“1”,则结果为“1”,否则为0。
例如:3 ^ 5等于0000 0011 0000 0101=0000 0001因此,3 ^ 5等于1。
此外,负数以补码的形式参与按位and运算。
特殊用途和操作:
(1)复位。如果要将一个单元格清零,即使它的二进制位都是0,也只需要用一个所有位都是0的数值求和,结果就是0。
(2)取一个号码,指向位置。
方法:找一个数,对应x要取的位,这个数对应的位是1,其余位是0。X中指定的位可以通过与这个数的AND运算得到。
例:设X=10101110,
X的低4位可以用X 0000 1111=0000 1110得到;
它也可以用来取x的第2、4和6位。
按位或运算符()
参与运算的两个对象根据二进制位进行或运算。
运算规则:0 0=0;01=1;10=1;11=1;
也就是说,只要参与运算的两个对象中有一个是1,它的值就是1。
例如:35等于0000 0011 0000 0101=0000 0111因此,35等于7。
此外,负数以补码的形式参与按位或运算。
OR运算的特殊功能:
(1)经常用来检查一个数据的某些位置。
方法:找出对应于X被设置为1的位的数字。这个数对应的位是1,其余位是0。这个数与X同相或者可以在X ^ 1中做一些位置。
例如:用X 0000 1111=1010 1111得到x=1010000的低4位1。
XOR运算符()
运算中涉及的两个数据根据二进制位进行异或运算。
运算规则:0 0=0;0^1=1;1^0=1;1^1=0;
即参与运算的两个对象,如果对应的两个位“不同”(不同的值),则位结果为1,否则为0。
异或运算的特殊功能;
(1)翻转一个特定的位找到一个数,这个数对应于要翻转的X的每一位。这个数对应的位是1,其余位是0。这个数可以与x的相应位进行异或运算。
例:x=1010110,翻转x的低4位,用x 0000 1111=1010 0001得到。
(2)不同于0或,保持原值,x 0000 0000=1010 1110。
从上面的例子可以清楚地看出这一点。
反转运算符(~)
参与运算的数据根据二进制位被“求反”。
运算规则:~ 1=0;~0=1;
也就是一个二进制数逐位反转,即0变成1,1变成0。
设一个数的最低位为零,可以表示为:a ~1。
~1的值是111111111111111110,然后最低位必须是0被and。因为“~”运算符的优先级高于算术运算符、关系运算符、逻辑运算符和其他运算符。
左移运算符()
将操作数的所有二进制位向左移动若干位(左边的位被丢弃,右边的位用0填充)。
例:a=a 2将A的二进制位左移2位,右加0,
左移1位后a=a * 2;
如果左移过程中丢弃的高位不包含1,则每次左移相当于将该数乘以2。
右移位运算符()
一个数的所有二进制位都右移若干位,正数左移0,负数左移1,右侧丢弃。
运算的每一位都向右移动,相当于把数除以2。
例如:a=a 2将A的二进制位右移2位,
向左加0或1取决于移位后的数字是正数还是负数。
将运算符expression1的所有位向右移动expression2指定的位数。表达式1的符号位用于填充右移后留下的空位。移出到右边的比特被丢弃。
例如,在评估以下代码后,temp的值为-4:
-14(即二进制11110010)通过右移两位等于-4(即二进制1111100)。
可变温度=-14 2
无符号右移位运算符()
将运算符expression1的每一位向右移动expression2指定的位数。右移后留下的空位用零填充。移出到右边的比特被丢弃。
示例:var temp=-14 2
变量temp的值为-14(二进制111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
复合赋值运算符
位运算符与赋值运算符相结合
=例:a =b等价于A=A B。
=例:a=b等价于A=A B。
=例:a=b等价于A=A B。
=例:a ^=b等价于A=A B
运算规则:类似于前面提到的复合赋值运算符的运算规则。
对不同长度的数据执行位操作。
如果两个长度不同的数据进行位运算,系统会将它们在右端对齐,然后进行位运算。
以AND运算为例,解释如下:我们知道在C语言中,long类型占用4个字节,int类型占用2个字节。如果一个long类型的数据是和一个int类型的数据,右端对齐后,左边不足的位会按照以下三种情况来补齐。
(1)如果整数数据为正,则向左加16个零。
(2)如果整数数据为负,则向左加16个1。
(3)如果整形后的数据是无符号数,则在左侧添加16个零。
例如长a=123int b=1;算个b。
例如长a=123int b=-1;算个b。
例如长a=123无符号int b=1;算个b。