一、比特和&符号( & )
1、概念:参加运算的两个对象以二进制比特进行and运算,负值以补数形式参加比特和运算。
2、运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; 也就是说,两人同时为“1”,结果为“1”,否则为“有0则为0”
例如,3 &5= 1,0000 0011 & 0000 0101 = 0000 0001
3“与运算”的特殊用途:
(1)清零。 如果想要清零一个单元格,则即使所有的二进制比特都为0,但是如果一个比特均为零,结果为零。
(2)按一个数量定位。 如果寻找与x取得的比特对应的数目,则该数目的对应比特为1,且馀数比特为0,因此若将该数目与x运算为“与”,则可获得x中的指定比特。
例如,如果X=10101110,则可以取x的后4位,也可以取X & 0000 1111 = 0000 1110中可得到的x的2、4、6位。
二、位或(|)
1、概念:参加运算的两个对象以二进制比特进行or运算,负数以补数形式参加比特和运算。
2、运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1; 也就是说,如果参加运算的2个对象是1个,那么其值为1【1的话为1】
例如,3|5 = 7,0000 0011|0000 0101 = 0000 0111
3、“或运算”的特殊作用:
(一)一个数据的特定地点常用的1。 如果找到一个整数,则对应于x为1的比特,其中对应的比特数为1,且剩馀比特为零。 这个数据可以是x相的,或者x的特定位置可以是1。
例如,可将X=10100000的较低的四个位置1表示为X | 0000 1111 = 1010 1111。
三、异或运算( ^ )
1、概念:参加运算两个数据以二进制比特进行异或运算
2、运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0; 即,参加运算的2个对象,如果2个对应的比特是“异”(值不同),则该比特的结果为1,否则为0【同0异1】
例如,3^5=6,即0000 0011^0000 0101 = 0000 0110
3“异或运算”的特殊作用:
(1)使特定比特反转以搜索奇数个比特,对应于x反转的比特,其奇数个对应比特为1,剩馀比特为0,该奇数个比特可与对应于x的比特异或。
(2)不同于0或保留原始值,x^0000=1010。
例如,使X=10101110,x的后4位反转,得到X ^ 0000 1111 = 1010 0001。
(3)基于异或运算,不参照新的变量而交换2个变量的值
a = a ^ b; b = a ^ b; a = a ^ b;
【同样根据加减运算,a = a + b; b = a - b; a = a -b; 》和
四、不同长度的数据进行位运算
如果两个不同长度的数据进行比特运算,则该数据与右端对齐后再进行比特运算。
以and运算为例,在c语言中long型占4字节,int型占2字节,long型的数据和int型的数据进行and运算,右端一致时,左边不足的比特在以下3种状况下得到补充
(1)整数数据为正时,左边追加16个0。
(2)如果整数数据为负数,则向左补充16个1。
(3)如果整形数据是无符号的数,则向左侧也追加16个零。
例如long a=123; int b=1; 计算a & b。
例如long a=123; int b=-1; 计算a & b。
例如long a=123; unsigned int b=1; 计算a & b。