Node.js 是一個 JavaScript 的執行環境。
在 Node.js 出現之前,JavaScript 只能在瀏覽器上運行,Node.js 就是提供 Javascript 除了瀏覽器以外的運行環境。
node <file-name>node,再輸入你的程式code . : 新增工作目錄code <file-name> : 開啟檔案option + cmd + i以前對於 ||、&& 邏輯運算子的看法是,不就是以前國中學過的嗎?這麼簡單有什麼好講的,但當時看 JavaScript 犀牛書的時候不禁讚嘆:「 原來還可以這樣?! 」,不過這節還是補充了以前不知道的資訊,太好了!
注意
在 JavaScript 裡,代表 false 的就只有幾個: 0、-0、NaN、null、undefined、"" ( ← 空字串 ),所以搞清楚 false 還蠻重要的喔,不然往後的日子應該有很多坑可以跳。
剛好複習一下當時的筆記:
|| 邏輯運算子 ORtrue,會回傳 true 的值,不再繼續查找後面的值。false,會回傳最後一個為 false 的值undefined || 0 || "hello" || false // 找到 true 回傳
> "hello"
NaN || 0 || undefined || "" || null // 全部都為 false,回傳最後一個 false 的值
> null
&& 邏輯運算子 ANDfalse,會回傳 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 為上面的範例 A :011010 → 26>> 位元右移n >> i : n 除以 2 的 i 次方
n >> 1: 往右移 1 位:等於 n / 2n >> 2: 往右移 2 位:等於 n / 4<< 位元左移n << i : n 乘以 2 的 i 次方
n << 1: 往左移 1 位:等於 n * 2n << 2: 往左移 2 位:等於 n * 4// 往左位移( 後面補 0 )
A: 011010 << 1 → 0110100 // 等於 26 << 1 等於 26 * 2 == 52
A: 011010 << 2 → 01101000 // 等於 26 << 2 等於 26 * 4 == 104
// 往右位移( 後面直接捨去 )
A: 011010 >> 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⁰ ) 是 1n & 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² ) 是 1n & 4 → 0 ,代表 n 的倒數第 3 個位元數 ( 2² ) 是 0本章學到兩個效能更好的實用小技巧,稍微複習一下:
n >> 1 效果如同 n / 2n << 1 效果如同 n * 2n & 1 效果如同 n % 2 → 1 , 代表 n 為 奇數n & 1 效果如同 n % 2 → 0 , 代表 n 為 偶數( 以上內容大部分是 程式導師實驗計畫第三期 的學習筆記,如有錯誤歡迎糾正,非常感謝 🤓 )
Written on April 22nd , 2019 by Yakim shu