【算法竞赛】运算符秒杀大厂面试题

  

  • 💌 博客内容:运算符秒杀大厂面试题

  • 😀 作  者:陈大大陈

  • 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信!

  • 💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

本期是一些大厂的面试题,都是关于运算符的,不多,但是涵盖的知识不少,希望大家有所收获!

下面代码的功能是什么呢? 

平均数 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int half(int a, int b)
{
	return (a & b) + ((a ^ b) >> 1);
}
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	printf("%d",half(a, b));
	return 0;
}

 答案是求两数的平均数。

这道题用笨方法的话就是转化成二进制然后按位与,但是这样的做法显然不是面试官所期待的,如果熟悉你熟悉操作符,那你就会知道。

x&y是取相同的位与,这个操作的结果是x和y相同位和的一半。

而x^y是不同位,右移一位就相当于除以二。

所以这个函数的功能就是求两个数的平均数。

看下面的例题前,先明白一个概念。

1. 二进制位异或运算就相当于对应位相加,不考虑进位
例如: 1 ^ 1 = 0 ---> 1 + 1 = 0 (进一位)
            1 ^ 0 = 1 ---> 1 + 0 = 1 (当前位值为1)
            0 ^ 0 = 0 ---> 0 + 0 = 0 (当前位值为0)

2. 二进制位与运算相当于对应位相加之后的进位
例如: 1 & 1 = 1 ---> 1 + 1 = 0 (进一位)
            1 & 0 = 0 ---> 1 + 0 = 1 (不进位)
            0 & 0 = 0 ---> 0 + 0 = 0 (不进位)

3. 两数相加就等于对应二进制位相加的结果 + 进位的结果
例如:3 + 2 --> 0011 + 0010---> 0011 ^ 0010 + ((0011 & 0010) << 1)
           ---> (0011 ^ 0010) ^ ((0011 & 0010) << 1), 当进位之后的结果为0时,相加结束

趁热打铁,看下面函数的功能。

求和 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Add(int a, int b)
{
	if (b == 0)
	{
		return a;//没有进位时完成运算
	}
	int sum, carry;
	sum = a ^ b;//为了完成第一步没有进位的加法运算
	carry = ((a & b) << 1);//完成第二步进位并左移
	return Add(sum, carry);//进行递归,相加
}
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	printf("%d",Add(a, b));
	return 0;
}

大家肯定一眼就看出来了,函数的功能是实现两数相加。 

判断 

 再来看一道题目吧!

用一个表达式,判断一个数X是否是2的N次方,不能使用循环语句。

这道题同样是用操作符来解答。

答案是!(X&(X-1))。

2,4,8这样的数转换成二进制是10,100,1000,如果X和X减一运算,答案是0,则X是2的N次方。

总结
  感谢观看,本文到这里就结束了,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹

  也欢迎你,关注我。👍 👍 👍

  原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉

  • 51
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 45
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈大大陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值