记一次校招面试回忆,迟来的位运算符小解

2,645 阅读6分钟

前言

大家好呀,我是wangly19。时方七月,绿树荫凉夏日长。一篇JavaScript的位运算符文章送给大家,希望大家在工作上顺顺利利。如果觉得有帮助,不妨给我一个👍吧。

JavaScript位运算符是一个非常有意思的东西,这一次给大家分享位运算符主要是做一个位运算符的总结。也时对校招的一道面试题的总结吧。说起来也是一段雨中踏浪行的故事。

一道简单的面试题

当时校招的时候发生一件非常有意思的事情,去一家小公司的坛子面试的时候,有一道非常简单的面试题,下面听君慢慢给你们回忆回忆,先看题:

  • 请你使用JavaScript实现一个判断任意数是奇数还是偶数的函数?

小伙伴们有没有被雷到,这不是送分题吗?我当时也是这么认为的,立马给出了解决的方式。可是奈何,终究发生了意外,看结果我竟然答错了,我觉得非常不可思议。下面贴出我的答案:

/**
* @param(Number) nb 需要判断的数
* @return(String) * 返回的结果
*/
function odevity (nb) {
  return nb & 1 ? `${nb}为奇数` : `${nb}为偶数`;
}

我当时检查了三遍后,还是没有找出问题,和面试人员说明我的题解并没有出现错误,可以用 controlConsole 结果。然而我万万没想到这个面试人员,这个面试人员竟然将 & 理解成了 && ,直接说出一句金句:

你这个题解,只要输入的数大于1,不都是奇数了吗。很明显的错误,这么简单的问题都看不出来?而且你语法还写错了。

- - QAQ

我当时:QAQ,战术狗头已经不能形容我的内心了,反手就怼了。

您能先区分一下位运算符和逻辑运算符在给出答案吗? 我通过传入的number值的二进制和001进行&(AND)运算,有什么问题吗? 难道您不知道,奇偶数在二进制中的特点吗?

- - QAQ

此时面试人员似乎的存在懵逼状态,或者说,他压根就没去了解过位运算符它是什么东西。我个人认为这名面试人员应该也相当于刚毕业或者刚培训出来的样子。非常不靠谱,后面面试的都是一没有什么意思的问题,全程都问 API 怎么用。当问到预期工资的时候,我的预期是他能给出的几倍。很明显,面试结果,最后挂了。。。。。。。。

这真就来白嫖呗。。。

- - QAQ

位运算符是什么东西

说起位运算符就有点意思了,大家都知道在编程的世界中,本质上的存储都是以进制的形式存在,都是1和0。想来上过大学计算机课,第一节好像就是这个吧,QAQ。大部分的数值运算,比如 100 + 100  都是先转换成为二进制后在进行计算,而位运算是直接对二进制进行计算,减少了数值转换的开销,因此执行效率会有些许提升。

下面所有的实例都省略了前置的0,具体可以看JavaScript的进制篇章,里面详细的说了,JavaScript 将数字存储为 64 位浮点数,但所有按位运算都以 32 位二进制数执行。不知道说的对不对,如果说错了,各位大佬可以评论区指正哈。

位逻辑

& 位逻辑与
^ 位逻辑异或
~ 位反转

& 位逻辑

将二进制数位只有当两边相同位置都是1时,结果返回1,其他都返回0。 通过4和7的每一位进行比对,可以看到,每一位都进行 & 运算后的值就是我们的结果。

| 位逻辑或

将二进制数位只有当两边相同位置都是0时,结果返回0,其他的情况都返回1

这里中间比较长的竖线是 | 运算符

- - QAQ

^ 位异或

将二进制数位两边相同位置都是相同,结果返回0,不相同时返回1,这个和|是存在区别的。

~位反转

将二进制数位进行反转,0变1,1变0 。类似反转

位计算

>> 右位移,正数高位补0,复数补1
<< 左位移,高位丢弃,低位补0
>>> 去符号右位移,高位补0

>> 右位移

右位移,正数高位补0,复数补1 向右边移动,低位会被会被替换,而高位会根据二进制的正负符号进行1和0的添加,从而值可能会根据你的符号而生成对应的正负值。

<< 左位移

向左边移动,高位会被删除,而低位会补0。一张图,相信大家都能看得懂吧。

>>> 无符号右位移

>> 右位移和 >>> 的区别在于, >> 在补位的时候会根据数值的符号对应的添加1 或者 0,而 >>> 则是一直添加0

位运算常见的使用方式

判断奇偶数

奇偶数判断

function odevity (nb) {
  return nb & 1 ? `${nb}为奇数` : `${nb}为偶数`;
}

取整

抛弃取整

14.1^0 => 14
-14.1^0 => -14
~~14.1 => 14
~~-14.1 => -14

相反数

利用反转取得相反数

function reverseNumber (nb) {
  return ~nb + 1
}

总结

位运算符有时候使用起来还是很方便的,尽量使用时进行声明,因为它本身非常的冷门,有好些小伙伴都不知道它。开头的面试是真实存在的。前端框架给前端开发带来了便利,导致很多小伙伴都在说学不动了。也不知道是福是祸,既然便利了,为什么还会出现学不动呢?其实还是因为技术框架的多样性。类比小程序,每个大厂都有自己一套小程序模板,那么开发者只能将每一家坑都踩一踩,与其说是学不动了,不如说是被业务压的喘不过气了。现在技术在变依旧脱离不了那一套。多学点基础知识,养好基本功。学习一些技术框架事半功倍。

永远不要让自己成为API工程师。知其一而知其三。

- - QAQ

本文使用 mdnice 排版