位运算符:
&(按位与)、|(按位或)、^(按位异或)、~(取反)、<<(左移)、>>(右移)。
1、 & 按位与:两数对应的二进制数位相与,两数位都为1时,该结果位才为1,否则为0。
例如:3 & 5 == (0000 0011 & 0000 0101 == 0000 0001) == 1
2、 | 按位或:两数对应的二进制数位相或,两数位有一个1,该结果位就为1。
例如: 3 | 5 == (0000 0011 | 0000 0101 == 0000 0111) == 7
3、 ^ 按位异或:两数对应的二进制数位相异或,两数位不同结果位为1,否则为0。
例如: 3 ^ 5 == (0000 0011 ^ 0000 0101 == 0000 0110 )== 6
4、 ~ 按位取反:运算数对应的二进制位按位求反。
例如:~ 3 == (~(0000 0011) == 1111 1100)== 252
5、<< 左移位运算:运算数对应的二进制数位全部左移若干位,高位丢弃,低位补0。
例如:10 << 1 == (0000 1010 << 1 == 0001 0100) == 20
6、 >> 右移位运算:运算数对应的二进制数位全部右移若干位,为整数时,高位补0,低位丢弃;为负数时,高位补0或补1取决于编译器。
例如: 10 >>1 == (0000 1010 >> 1 == 0000 0101)== 5
位运算的应用:(求某数的二进制有几个‘1’,二进制加减法)
#include <stdio.h>
int Many(int n)
{
int b = n;
int count = 0;
while( b ) //b每次减1,b为减为0时退出
{
b = b & (b-1);
count++;
}
return count;
}
int Add(int a,int b)
{
for(int i=1;i!=0;i<<=1)
{
if((b&i)!=0)//b当前位有数据,需要加到a
{
for(int j=i;j!=0;j<<=1)
{
if((a&j)!=0) // a当前位为1,需要置0
{
a &= ~j;//a ^= j;
}
else//将进位的0变1
{
a |= j;
break;
}
}
}
}
return a;
}
int Sub(int a,int b)
{
b = -b;
for(int i=1;i!=0;i<<=1)
{
if((b&i)!=0)//b当前位有数据,需要加到a
{
for(int j=i;j!=0;j<<=1)
{
if((a&j)!=0) // a当前位为1,需要置0
{
a &= ~j;//a ^= j;
}
else//将进位的0变1
{
a |= j;
break;
}
}
}
}
return a;
}
int main()
{
printf("%d\n",Many(7));
printf("%d\n",Many(-1));
printf("%d\n",Add(1,-2));
printf("%d\n",Add(1,2));
printf("%d\n",Sub(1,2));
printf("%d\n",Sub(2,1));
return 0;
}