真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

js中位運算的運用實例分析

我們可能很少在編程中用位運算,如果沒深入學(xué)習(xí),可能也很難理解。平時的數(shù)值運算,其實是要先轉(zhuǎn)換成二進(jìn)制再進(jìn)行運算的,而位運算就是直接進(jìn)行二進(jìn)制運算,所以位運算的執(zhí)行效率肯定是更高的。下面通過一些實例來加深對位運算的理解。

創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站制作、成都網(wǎng)站建設(shè)與策劃設(shè)計,烏什網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:烏什等地區(qū)。烏什做網(wǎng)站價格咨詢:028-86922220

按位與(&)

&&運算符我們都知道,只有兩個都為真,結(jié)果才為真。&道理是一樣的,只有兩個數(shù)的值為1時,才返回1。例如1和3的按位與操作:

    0001
&  0011
  ---------
    0001

只有對應(yīng)的數(shù)為1時,結(jié)果才為1,其他都為0。
判斷一個數(shù)是奇數(shù)還是偶數(shù),我們會用求余數(shù)來判斷:

function assert(n) {
  if (n % 2 === 1) {
 console.log("n是奇數(shù)");
 } else {
 console.log("n是偶數(shù)");
 }
}

assert(3); // "n是奇數(shù)"

我們也可以用一個數(shù)和1進(jìn)行按位&操作來判斷,而且速度更快:

function assert(n) {
if (n & 1) {
 console.log("n是奇數(shù)");
} else {
 console.log("n是偶數(shù)");
}
}

assert(3); // "n是奇數(shù)"

下面是位運算過程:

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。

按位或(|)

|與||操作符的道理也是一樣的,只要兩個數(shù)中有一個數(shù)為1,結(jié)果就為1,其他則為0。

  0001
| 0011
 ---------
  0011

對浮點數(shù)向下求整,我們會用下面的方法:

var num = Math.floor(1.1); // 1

我們也可以用位運算來求整:

var num = 1.1 | 0; // 1

其實浮點數(shù)是不支持位運算的,所以會先把1.1轉(zhuǎn)成整數(shù)1再進(jìn)行位運算,就好像是對浮點數(shù)向下求整。所以1|0的結(jié)果就是1。

按位非(~)

按位非就是求二進(jìn)制的反碼:

var num = 1; // 二進(jìn)制 00000000000000000000000000000001
var num1 = ~num; // 二進(jìn)制 11111111111111111111111111111110

我們知道,js中的數(shù)字默認(rèn)是有符號的。有符號的32位二進(jìn)制的最高位也就是第一位數(shù)字代表著正負(fù),1代表負(fù)數(shù),0代表整數(shù)。那到底11111111111111111111111111111110等于多少呢?最高位為1代表負(fù)數(shù),負(fù)數(shù)的二進(jìn)制轉(zhuǎn)化為十進(jìn)制:符號位不變,其他位取反加1。取反之后為10000000000000000000000000000001,加1之后為10000000000000000000000000000010,十進(jìn)制為-2。

按位異或(^)

按位異或是兩個數(shù)中只有一個1時返回1,其他情況返回0。

   0001
^ 0011
 ---------
  0010

數(shù)字與數(shù)字本身按位異或操作得到的是0,因為每兩個對應(yīng)的數(shù)字都相同,所以最后返回的都是0。

我們經(jīng)常會需要調(diào)換兩個數(shù)字的值:

var num1 = 1, num2 = 2, temp;
temp = num1;
num1 = num2; // 2
num2 = temp; // 1

如果裝逼一點的話,可以這樣:

var num1 = 1, num2 = 2;
num1 = [num2, num2 = num1][0];
console.log(num1); // 2
console.log(num2); // 1

如果想再裝的穩(wěn)一點的話,可以這樣:

var num1 = 1, num2 = 2;
num1 ^= num2; // num1 = num1 ^ num2 = 1 ^ 2 = 3
num2 ^= num1; // num2 = num2 ^ (num1 ^ num2) = 2 ^ (1 ^ 2) = 1
num1 ^= num2; // num1 = num1 ^ num2 = 3 ^ 1 = 2
console.log(num1); // 2
console.log(num2); // 1

有符號左移(<<)

有符號左移會將32位二進(jìn)制數(shù)的所有位向左移動指定位數(shù)。如:

var num = 2; // 二進(jìn)制10
num = num << 5; // 二進(jìn)制1000000,十進(jìn)制64

如果要求2的n次方,可以這樣:

function power(n) {
 return 1 << n;
}

power(5); // 32

1的二進(jìn)制是01,左移5位就是0100000,十進(jìn)制就是2的5次方32。

有符號右移(>>)

有符號右移會將32位二進(jìn)制數(shù)的所有位向右移動指定位數(shù)。如:

var num = 64; // 二進(jìn)制1000000
num = num >> 5; // 二進(jìn)制10,十進(jìn)制2

求一個數(shù)的二分之一:

var num = 64 >> 1; // 32

有符號左移與右移不會影響符號位。

無符號右移(>>>)

正數(shù)的無符號右移與有符號右移結(jié)果是一樣的。負(fù)數(shù)的無符號右移會把符號位也一起移動,而且無符號右移會把負(fù)數(shù)的二進(jìn)制碼當(dāng)成正數(shù)的二進(jìn)制碼:

var num = -64; // 11111111111111111111111111000000
num = num >>> 5; // 134217726

所以,我們可以利用無符號右移來判斷一個數(shù)的正負(fù):

function isPos(n) {
return (n === (n >>> 0)) ? true : false; 
}

isPos(-1); // false
isPos(1); // true

-1>>>0雖然沒有向右移動位數(shù),但-1的二進(jìn)制碼已經(jīng)變成了正數(shù)的二進(jìn)制碼:

11111111111111111111111111111111

所以-1>>>0的值為4294967295。

總結(jié)

以上的例子在平常可能會比較容易用到或看到,也是屬于比較容易理解的。一些比較復(fù)雜的、難理解的,我覺得應(yīng)該盡量少用,因為會給閱讀者帶來困難,也會給自己帶來麻煩。


網(wǎng)頁題目:js中位運算的運用實例分析
標(biāo)題來源:http://weahome.cn/article/jsecsp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部