按位与运算符()
参与运算的两个对象在二进制位上进行or运算。 运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
换句话说,如果参加运算的两个对象中的一个是1,则该值是1。
例如:3|5即00000011|00000101=00000111,所以3|5的价值是7。
另外,负数以补码的形式按位或参加运算。 “或运算”的特殊作用:
)1)常用于一个数据的位置1。
方法:找出与x对应并置1位的数。 那个数的对应位置是1,剩下的位置是0。 这个数可以等于x,或者x的一部分的位置可以为1。
例:可以用X|00001111=10101111得到X=10100000的低4个位置1。
异或运算符(^ )。
参加运算的2个数据通过二进制位进行异或运算。 运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
也就是说,对于参与运算的两个对象,如果两个对应的位“不同”,则该位的结果为1,否则为0。
异或运算的特殊作用:
)1)反转特定位,寻找与x要反转的各位相对应的数,该数的对应位为1,剩馀位为零,该数与x对应“异或”。
例如: X=10101110,将x的后4位反转,可以通过X^00001111=10100001得到。
)2)与0不同,或者保留原始值,X^00000000=10101110。
这从上面的例题中可以清楚地看到。
取逆运算符(~)
参加运算的1个数据对每个二进制比特进行“反转”运算。
运算规则:~1=0; ~0=1;
也就是说,对于一个二进制数,每比特取逆,即0变为1,1变为0。
将一个数的最下位设为零时,可以表示为a~1。
1的值为1111111111111111111110,按" and "键时最低位一定为0。 因为“~”运算符的优先级高于算术运算符、关系运算符、逻辑运算符和其他运算符。 左移运算符()。
使一个运算对象的各二进制比特全部左移几个比特(舍弃左边的二进制比特,向右补0 )。
例如:将a=a2的二进制比特向左移位2比特,向右补充0,向左移位1比特,然后a=a*2;
如果左移时舍弃的高位不包含1,则每左移1位,其数为2的乘积。
右移运算符()
将一个数的各二进制比特全部右移几个,正数左移0,负数左移1,右边舍弃。 操作数向右每次移动一位,相当于该数除以2。 例如,a=a2使a的二进制比特向右位移2个比特,向左补0,要看被移位数是正还是负。
将运算符expression1中的所有位向右移位expression2中指定的位数。 expression1的符号位用于向右移动以填充左边空的位。 向右移动的位将被丢弃。 例如,如果评估以下代码,则temp的值为-4。
-14 (即二进制的11110010 )向右移动2位即为-4(即二进制的11111100 )。
vartemp=-142
无符号右移运算符(
将运算符expression1的各位向右移位expression2指定的位数。 向右移动后,左边空出的位用零填充。 向右移动的位将被丢弃。 例如vartemp=-142
变量temp的值为-14 (即二进制111111111111111111111111111111110010 ),向右移动两个数量级为1073741820 (即二进制001111111111111111111111100 )
复合赋值运算符
组合位运算符和赋值运算符以构成新的复合赋值运算符。 它们=例如: a=b相当于a=ab
|=例: a|=b是a=a|b=例: a=b是a=ab=例: a=b相当于a=ab
^=例: a^=b相当于a=a^b
运算规则:与上述复合赋值运算符的运算规则类似。
对不同长度的数据进行位运算
对两个不同长度的数据进行位运算时,系统将两者对齐右端后进行位运算。
以逻辑与运算为例,我们知道在c语言中long型有4个字节,int型有2个字节。 进行某个long型数据和int型数据的逻辑与运算时,如果右边对齐,则左侧的不足位可以通过以下三种情况进行补充。
)1)整数数据为正时,向左添加16个0。 )2)整数数据为负数时,在左边追加16个1。 )3)在整形数据为无符号数的情况下,在左侧也追加16个0。 例如,longa=123; intb=1; 计算ab。 例如,longa=123; intb=-1; 计算ab。
例如,longa=123; unsignedintb=1; 计算ab。