你們好呀,我是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 排版