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 ;
}
以上三个题目可能对初学者来说比较难理解,初学者可以根据程序在稿纸上一步一步跟踪和演算,便可以吃透。