本期是一些大厂的面试题,都是关于运算符的,不多,但是涵盖的知识不少,希望大家有所收获!
下面代码的功能是什么呢?
平均数
#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次方。
总结
感谢观看,本文到这里就结束了,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹
也欢迎你,关注我。👍 👍 👍
原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉