少於 1 分鐘閱讀

前言

剛好看到有人在詢問此問題,就打了一大篇,非本科系大概不知道, 應該每個語言都有 « 和 » 這個兩個 operator 吧。

可以拿 mac 的計算機來按, command+3 切到程式語言模式 ( command+1 切回來) 觀察二進位的變化。( 如下面範例的點法,就是5 + <<17 + << + << + << )

Bitwise Shift 範例

## For integers it means bitwise left shift:
5 << 1  ## gives 10 
17 << 3 ## gives 136

這邊需要把十進位數字先轉換成二進位,再來做bit的位移

5 « 1

5的二進位0101 10的二進位1010 << 1 是表示往左位移 1 bit 的意思 因此0101往左位移 1 bit,就變成 1010 (因為往左移,最高位的位元會消失,最低位元補 0) 所以 5 « 1 會得到 10

17 « 3

17的二進位0001 0001 136的二進位1000 1000 << 3 是表示往左位移3 bit的意思 因此0001 0001往左位移3 bit,就變成1000 1000(補了3個0),也就是136 所以 17 « 3 會得到 10

為何是 2 的倍數

因為是二進位,所以每位移 1 就是 2 的幾次方倍起跳

<< 1 左移 1 位,就是多了 2^1 倍的意思,就是乘以 2 的意思 << 2 左移 2 位,就是多了 2^2 倍的意思,就是乘以 4 的意思

…以此類推

>> 1右移1位,就是少了2^1倍的意思,就是除以2的意思 >> 2右移2位,就是少了2^2倍的意思,就是除以4的意思

…以此類推

簡單來說,可以理解成

5 << 1  ## 等於 10 * 2^1
17 << 3 ## 等於 17 * 2^3 
5 >> 1  ## 等於 10 / 2^1
17 >> 3 ## 等於 17 / 2^3 

參考

  1. http://acm.nudt.edu.cn/~twcourse/BitwiseOperation.html

留言