C/C++学习笔记33:面试题中常见的位操作问题

笔者主要是从华为的相关机试题中总结出来的,主要也是从题目中来总结相关知识点:

问题描述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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值