[第二週] 基礎JavaScript - 01 邏輯、位元運算 - Yakim shu
文章推薦指數: 80 %
回憶起大四的時候去學校圖書館找JavaScript 的書( 而當時的我借到的其實是Java 的事就不提了... ),其他的運算子都非常好懂,直到翻開位元運算的那 ...
[第二週]基礎JavaScript-01邏輯、位元運算
介紹Node.js
Node.js是一個JavaScript的執行環境。
在Node.js出現之前,JavaScript只能在瀏覽器上運行,Node.js就是提供Javascript除了瀏覽器以外的運行環境。
執行方法:
node
剛好複習一下當時的筆記:
Javascript大全-01型別、值與變數
Javascript大全-02運算式與運算子
||邏輯運算子OR
只要找到第一個true,會回傳true的值,不再繼續查找後面的值。
全部都為false,會回傳最後一個為false的值
undefined||0||"hello"||false//找到true回傳
>"hello"
NaN||0||undefined||""||null//全部都為false,回傳最後一個false的值
>null
&&邏輯運算子AND
只要找到第一個false,會回傳false的值,不再繼續查找後面的值。
全部都為true,會回傳最後一個為true的值
"hello"&&10&&""&&1//找到false回傳
>""
10&&"world"&&1//全部都為true,回傳最後一個true的值
>1
位元運算
位元運算真的很有趣,今天整個下午都花在這了,吳鎮宇說的沒錯:「出來混,遲早要還的」一度逃避的東西還是被默默回來找你。
大四的時候很想學網頁,學姊跟我說:「可以去看JavaScript。
」,然後就去了學校圖書館找JavaScript的書,其他的運算子都非常好懂,直到翻開位元運算的那一頁,就沒有再翻過下一頁了。
(而且後來才發現我借到Java…)
(回到正題,跳一下)
要了解什麼是位元運算,首先要介紹位元位移,要知道什麼是位元位移,首先要有2進位的觀念。
(不難、先不要崩潰)
2^i
2⁵
2⁴
2³
2²
2¹
2⁰
數字
值
32
16
8
4
2
1
範例A
0
1
1
0
1
0
16+8+2=26
範例B
1
0
0
1
0
1
32+4+1=37
意思是說26的二進制表示法為011010、37的二進制表示法為100101。
>>、<>位元右移
n>>i:n除以2的i次方
n>>1:往右移1位:等於n/2
n>>2:往右移2位:等於n/4
<>1→001101//等於26>>1等於26/2==13
A:011010>>2→000110//等於26>>2等於26/4==6(餘數無條件捨去)
那這樣很不直覺的運算到底能幹嘛呢?
答案是在效能上有所差異,因為電腦只認得二進制的機器碼,所以照理來說,同樣得出n*2的運算結果,n<<1會比n*2還要來得快。
|、&、^位元運算子
注意:
不要把位元運算子|、&跟邏輯運算子||、&&搞混了,可以把位元運算子理解成2進位版的邏輯比較。
|位元OR
當成位元間的||,以0011|1001(3|9)為例,會回傳1011(11)
|運算結果
1
0
1
1
11
範例A
0
0
1
1
3
範例B
1
0
0
1
9
可以拆解成以下步驟:
-2^3→0||1→1
-2^2→0||0→0
-2^1→1||0→1
-2^0→1||1→1
&位元AND
當成位元間的&&,以0011&1001(3&9)為例,會回傳0001(1)
&運算結果
0
0
0
1
1
範例A
0
0
1
1
3
範例B
1
0
0
1
9
可以拆解成以下步驟:
-2^3→0&&1→0
-2^2→0&&0→0
-2^1→1&&0→0
-2^0→1&&1→1
^位元XOR
最特別的一種,只有當兩邊是一樣的:0^0和1^1的時候才會回傳0。
同樣以0011^1001(3^9)為例,會回傳1010(10)
^運算結果
1
0
1
0
10
範例A
0
0
1
1
3
範例B
1
0
0
1
9
可以拆解成以下步驟:
-2^3→0^1→1
-2^2→0^0→0
-2^1→1^0→1
-2^0→1^1→0
注意:
上面的2^3,是為了方便表示2的3平方,不要跟^位元運算子搞混了。
應用
又回到每天都要問的問題,所以到底能幹嘛勒?!
做個小實驗,把任意數字n跟1做&位元運算會發生什麼事?
n&1→1,代表n的最後1個位元數(2⁰)是1
n&1→0,代表n的最後1個位元數(2⁰)是0
猜出來了嗎?將n&1是判斷n是奇數or偶數的小技巧。
除了使用n%2“取餘數“的傳統方式,n&1是個效能更好的方法。
10&1→0//偶數
11&1→1//奇數
再把任意數字n跟2的任意平方做&位元運算會發生什麼事?
n&4→1,代表n的倒數第3個位元數(2²)是1
n&4→0,代表n的倒數第3個位元數(2²)是0
…
以此類推下去,有點類似遮罩的概念
結論
本章學到兩個效能更好的實用小技巧,稍微複習一下:
n>>1效果如同n/2
n<<1效果如同n*2
n&1效果如同n%2→1,代表n為奇數
n&1效果如同n%2→0,代表n為偶數
(以上內容大部分是程式導師實驗計畫第三期的學習筆記,如有錯誤歡迎糾正,非常感謝🤓)
Writtenon
April
22nd
,
2019
byYakimshu
Feelfreetoshare!
Youmayalsoenjoy:
[第二週]基礎JavaScript-03函式Function
[第二週]基礎JavaScript-02變數
延伸文章資訊
- 1JavaScript 運算子Operators - Fooish 程式技術
算術運算子(Arithmetic Operators); 位元運算子(Bitwise Operators); 邏輯運算子(Logical Operators); 字串運算子(String Ope...
- 2JavaScript 基礎知識-邏輯運算子&&,|| - iT 邦幫忙
JavaScript 基礎知識-邏輯運算子&&,|| ... 生活上也會有類似的邏輯判斷,例如:媽媽拜託小明去市場買菜,要買到牛肉,青菜和洋蔥,成功買到這三樣,媽媽才 ...
- 3重新認識JavaScript: Day 06 運算式與運算子 - iT 邦幫忙
邏輯運算子(Logical Operator); 字串運算子(String Operator); 特殊運算子(Special Operator). 由於篇幅的關係,系列文只會針對常見 ...
- 4JavaScript 利用表達式優化你的程式碼 - 卡斯伯Blog
邏輯運算子包含 && 、 || 、 ! ,在語法的概念上稱為and、or、not,常見情境是用來作為判斷語句使用(condition),不過在文件中的描述卻不僅於此,以 ...
- 5[第四週] JavaScript — 使用邏輯運算子更靈活使用if - Miahsu
現代JavaScript 教程:逻辑运算符. JavaScript 中三個邏輯運算子. 為了讓一開始簡單一些,我們先從boolean 值來了解基本的邏輯運算子 ...