笔者主要是从华为的相关机试题中总结出来的,主要也是从题目中来总结相关知识点:
问题描述1:统计一个二进制表中的0的个数(首位1之前0不计)
分析:其实统计0的个数,我们可以用这个二进制数与1进行与操作,再进行移位操作,这样从低位到高位就可以一步步的计算出多少个0了。
代码实现:
#include <iostream>
using namespace std;
int fun(int num)
{
int i=0;
int count=0;
while(num)
{
if(num&1)
{
count++;
}
num=num>>1;
i++;
}
return(i-count);
}
int main()
{
int num;
cout << "please enter a integer:\n"<<endl;
cin >> num;
cout <<fun(num)<<endl;
return 0;
}
问题描述2:镜像反转二进制表达式,并输出十进制数
分析:首先我们用a&1的时候分别记录了第几位有1,分别存在数组中
一个数*2是向左移1位。比如说是0101,那么数组d[0]中存的是右起第一位,此时就需要把这个位向左边移4位才能够达到镜像。
于是就有了:val=val*2+d[i];为移动后的值:
#include <iostream>
using namespace std;
int func(int a)
{
int val=0;
int temp;
int i;
int n=0;
int b[100];
while(a!=0)
{
temp=(a&1);
b[n++]=temp;
a=(a>>1);
}
for(i=0;i<n;i++)
{val=val*2+b[i];}
return val;
}
int main()
{
int n;
cout <<"enter:";
cin>>n;
cout <<func(n)<<endl;
}