<<
)、右移(>>
)&
)、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去補足吧。
很多東西都是用到才會去查,所以查資料跟篩選資料來源比較重要!
by the way 昨天發生還在草稿畫面修修改改時,沒有點下面的儲存草稿又不小心按到上一頁,就悲劇了(都沒存到QQ)!今天決定貼完就送出了,怎麼改都不會完美的(
反正不會有人看啦~)。