位操作符用于在最基本的層次上,即按內(nèi)存中表示的數(shù)值的位來(lái)操作數(shù)值,ECMAScript中所有數(shù)值都以IEEE-754 64位格式存儲(chǔ),但位操作符并不直接操作64位的值。而是先將64位的值轉(zhuǎn)換成32位的整數(shù),然后執(zhí)行操作,最后再將結(jié)果轉(zhuǎn)換回64位。對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),由于64位存儲(chǔ)格式是透明的,因此整個(gè)過(guò)程就像是只存在32位的整數(shù)一樣。
對(duì)于有符號(hào)的整數(shù),32位中的前31位用于表示整數(shù)的值。第32位用于表示數(shù)值的符號(hào):0表示整數(shù),1表示負(fù)數(shù)。這個(gè)表示符號(hào)的位叫做符號(hào)位,符號(hào)位的值決定了其他位數(shù)值的格式。其中,正數(shù)以純二進(jìn)制格式存儲(chǔ),31位中的每一位都表示2的冪。
10010 ?=> ?2(4)*1 + 2(3)*0 + 2(2)*0 + 2(1)*1 + 2(0)*0 = 18
負(fù)數(shù)同樣以二進(jìn)制碼存儲(chǔ),但是用的格式是二進(jìn)制補(bǔ)碼。計(jì)算一個(gè)數(shù)值的二進(jìn)制補(bǔ)碼,需要經(jīng)過(guò)以下3個(gè)步驟:
1.求這個(gè)數(shù)值絕對(duì)值的二進(jìn)制碼
2.求二進(jìn)制反碼
3.得到的二進(jìn)制反碼加1
按位非(NOT)
按位非操作符由一個(gè)波浪線(~)表示,執(zhí)行按位非的結(jié)果就是返回?cái)?shù)值的反碼。按位非是ECMASsript操作符中少數(shù)幾個(gè)與二進(jìn)制計(jì)算有關(guān)的操作符之一。
var num = 25;
var num2 = ~num;
alert(num2); // -26
按位與(AND)
按位與操作符由一個(gè)和號(hào)字符(&)表示,它有兩個(gè)操作符數(shù)。從本質(zhì)上講,按位與操作就是將兩個(gè)數(shù)值的每一位對(duì)齊,然后根據(jù)規(guī)則(兩個(gè)數(shù)值的對(duì)應(yīng)位都是1時(shí)才返回1,其他都返回0),對(duì)相同位置上的兩個(gè)數(shù)執(zhí)行AND操作。
var r = 25 & 3;
alert(r); // 1
按位或(OR)
按位或操作符由一條豎線符號(hào)(|)表示,和按位與一樣也是兩個(gè)操作符數(shù)。從本質(zhì)上講,其將兩個(gè)數(shù)值的每一位對(duì)齊,然后根據(jù)規(guī)則(兩個(gè)數(shù)值的對(duì)應(yīng)位都是0時(shí)才返回0,其他都返回1),對(duì)相同位置上的兩個(gè)數(shù)執(zhí)行OR操作。
var r = 25 | 3;
alert(r); // 27
按位異或(XOR)
按位異或操作符有一個(gè)插入符號(hào)(^)表示,也有兩個(gè)操作符。規(guī)則(對(duì)應(yīng)位相等返回0,不等返回1)
左移
左移操作符是由兩個(gè)小于號(hào)(<<)表示,這個(gè)操作符會(huì)將數(shù)值的所有位向左移動(dòng)指定位數(shù)。
右移
右移操作符是由兩個(gè)大于號(hào)(>>)表示,這個(gè)操作符會(huì)將數(shù)值的所有位向右移動(dòng)指定位數(shù)。
左移帶符號(hào)
左移操作符是由三個(gè)小于號(hào)(<<<)表示,這個(gè)操作符會(huì)將數(shù)值的所有位向左移動(dòng)指定位數(shù)。
右移帶符號(hào)
右移操作符是由三個(gè)大于號(hào)(>>>)表示,這個(gè)操作符會(huì)將數(shù)值的所有位向右移動(dòng)指定位數(shù)。