位操作符用于在最基本的層次上,即按內(nèi)存中表示的數(shù)值的位來操作數(shù)值柱搜,ECMAScript中所有數(shù)值都以IEEE-754 64位格式存儲(chǔ)迟郎,但位操作符并不直接操作64位的值。而是先將64位的值轉(zhuǎn)換成32位的整數(shù)聪蘸,然后執(zhí)行操作宪肖,最后再將結(jié)果轉(zhuǎn)換回64位表制。對(duì)于開發(fā)人員來說,由于64位存儲(chǔ)格式是透明的匈庭,因此整個(gè)過程就像是只存在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)過以下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ù)。