位操作符

位操作符用于在最基本的層次上,即按內(nèi)存中表示數(shù)值的位來操作數(shù)值。ECMAScript中的所有數(shù)值都以IEEE-754 64位格式存儲,但位操作符并不直接操作 64位的值。而是先將64位的值轉(zhuǎn)換成32位的整數(shù),然后執(zhí)行操作,最后再將結(jié)果轉(zhuǎn) 換回64位。對于開發(fā)人員來說,由于64位存儲格式是透明的,因此整個過程就像是 只存在32位的整數(shù)一樣。
對于有符號的整數(shù),32位中的前31位用于表示整數(shù)的值。第32位用于表示數(shù)值的符 號:0表示正數(shù),1表示負數(shù)。這個表示符號的位叫做符號位,符號位的值決定了其 他位數(shù)值的格式。其中,正數(shù)以純二進制格式存儲,31位中的每一位都表示2的 冪。第一位(叫做位0)表示20,第二位表示21,以此類推。沒有用到的位以0填 充,即忽略不計。例如,數(shù)值18的二進制表示是 00000000000000000000000000010010,或者更簡潔的10010。這是5個有效位,這5 位本身就決定了實際的值(如圖所示)。

(18).toString(2)// "10010"
按位與(AND) &
&以特定的方式組合操作二進制數(shù)中對應(yīng)的位,如果對應(yīng)的位都為1,那么結(jié)果就是1, 如果任意一個位是0 則結(jié)果就是0。
// 1的二進制表示為: 00000000 00000000 00000000 00000001// 3的二進制表示為: 00000000 00000000 00000000 00000011// -----------------------------// 1的二進制表示為: 00000000 00000000 00000000 00000001console.log(1 & 3) // 1
按位或(OR) |
| 運算符跟 & 的區(qū)別在于如果對應(yīng)的位中任一個操作數(shù)為1 那么結(jié)果就是1。
// 1的二進制表示為: 00000000 00000000 00000000 00000001// 3的二進制表示為: 00000000 00000000 00000000 00000011// -----------------------------// 3的二進制表示為: 00000000 00000000 00000000 00000011console.log(1 | 3) // 3
有符號右移>>
有符號的右移操作符由兩個大于號(>>)表示,這個操作符會將數(shù)值向右移動,但 保留符號位(即正負號標記)。有符號的右移操作與左移操作恰好相反,即如果將 64向右移動5位,結(jié)果將變回2:
var oldValue = 64; // 等于二進制的1000000var newValue = oldValue >> 5; // 等于二進制的10 ,即十進制的2
同樣,在移位過程中,原數(shù)值中也會出現(xiàn)空位。只不過這次的空位出現(xiàn)在原數(shù)值的 左側(cè)、符號位的右側(cè)(見圖)。而此時ECMAScript會用符號位的值來填充所有 空位,以便得到一個完整的值。

計算機里的數(shù)是用二進制表示的,最左邊的這一位一般用來表示這個數(shù)是正數(shù)還是負數(shù),這樣的話這個數(shù)就是有符號整數(shù)。如果最左邊這一位不用來表示正負,而是和后面的連在一起表示整數(shù),那么就不能區(qū)分這個數(shù)是正還是負,就只能是正數(shù),這就是無符號整數(shù)。
