你们好呀,我是wangly19。时方七月,绿树荫凉夏日长。一篇JavaScript的位运算符文章送给你们,但愿你们在工做上顺顺利利。若是以为有帮助,不妨给我一个👍吧。前端
JavaScript位运算符是一个很是有意思的东西,这一次给你们分享位运算符主要是作一个位运算符的总结。也时对校招的一道面试题的总结吧。提及来也是一段雨中踏浪行的故事。web
当时校招的时候发生一件很是有意思的事情,去一家小公司的坛子面试的时候,有一道很是简单的面试题,下面听君慢慢给大家回忆回忆,先看题:面试
小伙伴们有没有被雷到,这不是送分题吗?我当时也是这么认为的,立马给出了解决的方式。但是奈何,终究发生了意外,看结果我居然答错了,我以为很是难以想象。下面贴出个人答案:编程
/** * @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 排版