No.10 运算符应用详解

C语言中的&,||,&&,^用法可谓灵活多样,掌握了这些运算符的用法,可以大大提高编程效率,尤其涉及到二进制位的编程,其优点将会更加淋漓尽致地发挥出来。
直接上代码:

1.输入一个十进制数,返回它的二进制序列中"1"的个数。
方法1//将value值和1进行相与,若结果为1,则计数器加1.再将value整体右移,循环32次,使每一位都和1相与。
#include <stdio.h>

int Count_One_bits(int value) 
{
	int count = 0 ;
	int i = 0 ;
	for(i=0; i<32; i++)
	{
		if ((value & 1) == 1)
		{
			count++ ;
		}
		value >>= 1 ;
	}
	return count ;
}

int main()
{
	int value  = 0 ;
	int ret = 0 ;
	printf("请输入一个数字: ") ;
	scanf("%d", &value) ;
	ret = Count_One_bits(value) ;
	printf("1的位数为: %d\n", ret) ;
	return 0 ;
}

方法2//此方法是将value和(value-1)进行按位与,直到value变成0。
#include <stdio.h>

int Count_One_bits(int value) 
{
	int count = 0 ;
	while (value)
	{
		value = value & (value-1) ;
		count++ ;
	}
	return count ;
}

int main()
{
	int value  = 0 ;
	int ret = 0 ;
	printf("请输入一个数字: ") ;
	scanf("%d", &value) ;
	ret = Count_One_bits(value) ;
	printf("1的位数为: %d\n", ret) ;
	return 0 ;
}


2.返回一个数二进制的奇数和偶数序列。

#include <stdio.h>

void Get_binary_bits(int n) 
{
	int i = 0 ;
	printf("偶数序列为: ") ;

	for(i=31; i>0; i-=2)  //把偶数位分别右移到最后和进行与操作
	{
		printf("%d " ,((n>>i) & 1)) ;
	}

	printf("\n") ;
	printf("奇数序列为: ") ;

	for(i=30; i>=0; i-=2)//把奇数位分别右移到最后和进行与操作
	{
		printf("%d " ,((n>>i) & 1)) ;
	}
	printf("\n") ;

}
int main()
{
	int value = 0 ;
	printf("请输入一个十进制数字: ") ;  
	scanf("%d", &value) ;
	Get_binary_bits(value) ;
	return 0 ;
}

3.判断二进制序列有多少位不同。
//1.将两个数字分别右移i位,与1相与,判断是不是相等;
//2.也可以直接使用异或操作符并设计计数器来计算;
//3.还可以将两个数异或之后,再将异或的结果ret进行 ret&(ret -1),计数器加1,设个while循环,直到ret为0,返回计数器的值
方法1.#include <stdio.h>

int Cal_diff_binary_bits(int m, int n)
{
	int count = 0 ;
	int i = 0 ;
	for(i=0; i<32; i++)
	{
		if ((m>>i & 1)   !=  (n>>i & 1))
			count++;
	}
	return count ;
}

int main()
{
	int value1 = 0 ;
	int value2 = 0 ;
	int ret = 0 ;
	printf("请输入两个十进制数字: ") ;
	scanf("%d%d", &value1, &value2) ;
	ret = Cal_diff_binary_bits(value1, value2) ;
	printf("其二进制序列有%d位不同\n", ret) ;
	return 0 ;
}

方法2. #include <stdio.h>

int Cal_diff_binary_bits(int m, int n)
{
	int count = 0 ;
	int i = 0 ;
	int ret = 0 ;
	ret = m^n ;
	for(i=31; i>=0; i--)
	{
		if ((ret>>i) & 1 ==1)
			count++;
	}
	return count ;
}

int main()
{
	int value1 = 0 ;
	int value2 = 0 ;
	int ret = 0 ;
	printf("请输入两个十进制数字: ") ;
	scanf("%d%d", &value1, &value2) ;
	ret = Cal_diff_binary_bits(value1, value2) ;
	printf("其二进制序列有%d位不同\n", ret) ;
	return 0 ;
}

方法3. #include <stdio.h>

int Cal_diff_binary_bits(int m, int n)
{
	  int ret = 0 ;
	  int count = 0 ;
	  ret = m^n;
	  while(ret)
	  {
		  ret = ret & (ret-1) ;
		  count++ ;
	  }
	  return count ;
}

int main()
{
	int value1 = 0 ;
	int value2 = 0 ;
	int ret = 0 ;
	printf("请输入两个十进制数字: ") ;
	scanf("%d%d", &value1, &value2) ;
	ret = Cal_diff_binary_bits(value1, value2) ;
	printf("其二进制序列有%d位不同\n", ret) ;
	return 0 ;
}

以上三个题目可能对初学者来说比较难理解,初学者可以根据程序在稿纸上一步一步跟踪和演算,便可以吃透。

猜你喜欢

转载自blog.csdn.net/studyhardi/article/details/83267983
今日推荐