我們可能很少在編程中用位運(yùn)算,如果沒深入學(xué)習(xí),可能也很難理解。平時(shí)的數(shù)值運(yùn)算,其實(shí)是要先轉(zhuǎn)換成二進(jìn)制再進(jìn)行運(yùn)算的,而位運(yùn)算就是直接進(jìn)行二進(jìn)制運(yùn)算,所以位運(yùn)算的執(zhí)行效率肯定是更高的。下面通過一些實(shí)例來加深對(duì)位運(yùn)算的理解。
按位與(&)
&&運(yùn)算符我們都知道,只有兩個(gè)都為真,結(jié)果才為真。&道理是一樣的,只有兩個(gè)數(shù)的值為1時(shí),才返回1。例如1和3的按位與操作:
0001
& 0011
---------
0001
只有對(duì)應(yīng)的數(shù)為1時(shí),結(jié)果才為1,其他都為0。
判斷一個(gè)數(shù)是奇數(shù)還是偶數(shù),我們會(huì)用求余數(shù)來判斷:
function assert(n) { if (n % 2 === 1) { console.log("n是奇數(shù)"); } else { console.log("n是偶數(shù)"); }}assert(3); // "n是奇數(shù)"我們也可以用一個(gè)數(shù)和1進(jìn)行按位&操作來判斷,而且速度更快:
function assert(n) {if (n & 1) { console.log("n是奇數(shù)");} else { console.log("n是偶數(shù)");}}assert(3); // "n是奇數(shù)"下面是位運(yùn)算過程:
1 = 0001
3 = 0011
--------
& = 0001
奇數(shù)的二進(jìn)制碼的最后一位數(shù)肯定是1,而1只有最后一位為1,按位&操作之后,結(jié)果肯定只有最后一位數(shù)為1。而偶數(shù)的二進(jìn)制表示的最后一位數(shù)是0,和1進(jìn)行按位&操作,結(jié)果所有位數(shù)都為0。
按位或(|)
|與||操作符的道理也是一樣的,只要兩個(gè)數(shù)中有一個(gè)數(shù)為1,結(jié)果就為1,其他則為0。
0001
| 0011
---------
0011
對(duì)浮點(diǎn)數(shù)向下求整,我們會(huì)用下面的方法:
var num = Math.floor(1.1); // 1
我們也可以用位運(yùn)算來求整:
var num = 1.1 | 0; // 1
其實(shí)浮點(diǎn)數(shù)是不支持位運(yùn)算的,所以會(huì)先把1.1轉(zhuǎn)成整數(shù)1再進(jìn)行位運(yùn)算,就好像是對(duì)浮點(diǎn)數(shù)向下求整。所以1|0的結(jié)果就是1。
按位非(~)
按位非就是求二進(jìn)制的反碼:
var num = 1; // 二進(jìn)制 00000000000000000000000000000001
var num1 = ~num; // 二進(jìn)制 11111111111111111111111111111110
我們知道,js中的數(shù)字默認(rèn)是有符號(hào)的。有符號(hào)的32位二進(jìn)制的最高位也就是第一位數(shù)字代表著正負(fù),1代表負(fù)數(shù),0代表整數(shù)。那到底11111111111111111111111111111110等于多少呢?最高位為1代表負(fù)數(shù),負(fù)數(shù)的二進(jìn)制轉(zhuǎn)化為十進(jìn)制:符號(hào)位不變,其他位取反加1。取反之后為10000000000000000000000000000001,加1之后為10000000000000000000000000000010,十進(jìn)制為-2。
按位異或(^)
按位異或是兩個(gè)數(shù)中只有一個(gè)1時(shí)返回1,其他情況返回0。
新聞熱點(diǎn)
疑難解答
圖片精選