二进制运算———位运算应用(二进制加减,求整数的二进制中“1”的个数)(C语言)

位运算符:

     &(按位与)、|(按位或)、^(按位异或)、~(取反)、<<(左移)、>>(右移)。

1、 & 按位与:两数对应的二进制数位相与,两数位都为1时,该结果位才为1,否则为0。

例如:3 & 5 == (0000 0011  &  0000 010== 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 011== 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 

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;
	
}

 

 

 

 

 

 

 

 

你可能感兴趣的:(c语言)