今天分享几个用C语言操作符解决的二进制序列问题
- 写一个函数返回参数二进制中 1 的个数
比如: 15 0000 1111 4 个 1
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int count_one_bits(unsigned int val)
{
int count = 0;
for (int i = 1; i <= 32; i++) //从右边的低位开始一位一位的将该二进制序列右移,然后和1做&运算就得到该位的数字。
{
if (((val >> (i - 1)) & 1) == 1) //判断该位数字是否为1
count++;
}
return count;
}
int main()
{
unsigned int n;
printf("请输入二进制序列:\n");
scanf("%u",&n);
printf("该二进制序列中1的个数为:%d个\n",count_one_bits(n));
system("pause");
return 0;
}
利用了1和任何数做&运算还是任何数的性质。
- 获取一个数二进制序列中所有的偶数位和奇数位,
分别输出二进制序列。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void print(int n)
{//获取奇数位
for (int i = 31; i >= 1; i-=2) //从最高位开始右移,隔两位移一次
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
//获取偶数位
for (int i = 30; i >= 0; i-=2) //从最高位开始右移,隔两位移一次
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
}
int main()
{
int n;
printf("请输入二进制序列:\n");
scanf("%d",&n);
print(n);
system("pause");
return 0;
}
- 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int get_difbits(int m,int n)
{
int ret = m^n; //先将两个数的异或结果存到ret变量中,因为异或原则是“相同为0,不同为1”!
int cnt = 0;
for (int i = 1; i <= 32; i++)
{
if (((ret >> (i - 1)) & 1) == 1) //再将次结果的每一位都和1做&运算看,有多少个1,就代表有多少个不同位。
cnt++;
}
return cnt;
}
int main()
{
int a, b;
printf("请输入两个整数:\n");
scanf("%d %d",&a,&b);
printf("一共有%d个bit位不同\n",get_difbits(a, b));
system("pause");
return 0;
}
所以说C语言中有不少操作符都是比较实用的,往往可以用他们更方便,更巧妙的解决一些问题。掌握这些操作符还是最基础的要求!