iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
Modern Web

[學習筆記] 邊學邊寫 JavaScript 30天系列 第 3

[學習筆記] 邊學邊寫 JavaScript 30天 (3):運算II

  • 分享至 

  • xImage
  •  

今天內容

  • 位移運算:左移(<<)、右移(>>)
  • 位元運算:and(&)、or(|)、xor(^)、not(~)。

筆記

  • 位移運算:左移(<<)、右移(>>)

    4 << 1 //8
    8 >> 1 //4
    

    這個例子要從二進位的角度來看:
    0100 = 2^2 = 4
    1000 = 2^3 = 8
    將0100整個數字往左移一位把前面的0擠掉之後,後面補0變成1000就從4變成8,也就是X2了。
    所以可以看成左移是乘以二,右移是除以二(不能整除的話會是無條件捨去)。

    2 << 1   //4  -> 2*2
    2 << 2   //8  -> 2*2*2
    2 << 3   //16 -> 2*2*2*2
    5 << 1   //10 -> 5*2
    5 << 2   //20 -> 5*2*2
    5 << 3   //40 -> 5*2*2*2
    //左移幾次就乘幾次2
    
    10 >> 1  //5  -> 10/2
    10 >> 2  //2  -> 10/2/2
    10 >> 3  //1  -> 10/2/2/2
    10 >> 4  //0  -> 10/2/2/2/2
    //右移幾次就除幾次2
    

    用二進位對電腦來說是最原始的形式,所以正常情況下使用位移來寫效能會比直接寫4*2來的快。

  • 位元運算

    • and(&)、or(|)
      位元運算 與之前的 邏輯運算 是不一樣的,符號差別在一個跟兩個,然後位元運算要從二進位角度來看。
      例如:10的二進位為1010,15的二進位為1111,二進位後再依位置一位一位去邏輯比較。

      //這是邏輯運算
      10 && 15 //15 -> 兩個都是true,執行後面
      10 || 15 //10 -> 兩個都是true,執行前面
      
      //這是位元運算
      10 & 15  //10 -> 1010變10進位是10
      10 | 15  //15 -> 1111變10進位是15
      

      直立圖比較好觀看

    • xor(^):兩個一樣回傳0,不一樣回傳1,昨天提到的在JavaScript裡^不是次方,而是xor(Exclusive or)。

      1 xor 1 //0
      0 xor 1 //1
      1 xor 1 //0
      0 xor 1 //1
      //0101 -> 5
      
    • not(~):把1轉0,0轉為1

      ~15  // -16
      

      為什麼答案會是-16呢?因為1111 -> 0000 但前面還有你看不到的0被省略,所以會變成 111(略)110000 最後4個才是0000,這個可以看MDN的解釋~

      或是看這個免費影片也能了解電腦怎麼儲存數字的[CS101] 初心者的計概與 coding 火球術
      3-3:數字的儲存,影片在2:44說到第一個bit是1代表這是負數
      所以上面的~15才會變是-16。

    • 巧妙的用法
      在二進位最後一個數字是0的話,代表這個數字一定是偶數。
      想知道某數字是奇數還是偶數時,對該數做and結果為1的是奇數,0的是偶數。在之前要判定是不是奇數/偶數的方式比較常見的是取餘數。現在又多知道了一種方法了。

      10 & 1  // 0
      11 & 1  // 1
      12 % 2  // 0
      11 % 2  // 1
      

今天就把運算的部分說完啦,沒說到的部分就從MDN去補足吧。
很多東西都是用到才會去查,所以查資料跟篩選資料來源比較重要!/images/emoticon/emoticon29.gif

by the way 昨天發生還在草稿畫面修修改改時,沒有點下面的儲存草稿又不小心按到上一頁,就悲劇了(都沒存到QQ)!今天決定貼完就送出了,怎麼改都不會完美的(反正不會有人看啦~)。


參考資料


上一篇
[學習筆記] 邊學邊寫 JavaScript 30天 (2):Node.js 環境建置和運算I
下一篇
[學習筆記] 邊學邊寫 JavaScript 30天 (4):變數 I
系列文
[學習筆記] 邊學邊寫 JavaScript 30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
Vic
iT邦新手 3 級 ‧ 2022-09-18 11:20:18

今天決定貼完就送出了,怎麼改都不會完美的(反正不會有人看啦~)。

正在看/images/emoticon/emoticon33.gif

LeeFang iT邦新手 2 級 ‧ 2022-09-18 12:00:30 檢舉

/images/emoticon/emoticon16.gif

0
Chris
iT邦新手 3 級 ‧ 2022-09-18 21:31:43

先在 hackmd 上寫完,再貼上來,才是保持完美的小秘訣

0
Chris
iT邦新手 3 級 ‧ 2022-09-18 21:32:14

另外,還有一個有趣的小題目,就是任何運算,都可以用位元運算來完成。

我要留言

立即登入留言