亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 12:21:21
字體:
來源:轉載
供稿:網友

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

按位與(&)

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

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

只有對應的數為1時,結果才為1,其他都為0。
判斷一個數是奇數還是偶數,我們會用求余數來判斷:

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

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

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

下面是位運算過程:

1 = 0001
3 = 0011
--------
   & = 0001

奇數的二進制碼的最后一位數肯定是1,而1只有最后一位為1,按位&操作之后,結果肯定只有最后一位數為1。而偶數的二進制表示的最后一位數是0,和1進行按位&操作,結果所有位數都為0。

按位或(|)

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

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

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

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

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

var num = 1.1 | 0; // 1

其實浮點數是不支持位運算的,所以會先把1.1轉成整數1再進行位運算,就好像是對浮點數向下求整。所以1|0的結果就是1。

按位非(~)

按位非就是求二進制的反碼:

var num = 1; // 二進制 00000000000000000000000000000001
var num1 = ~num; // 二進制 11111111111111111111111111111110

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

按位異或(^)

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

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

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

我們經常會需要調換兩個數字的值:

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

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

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

如果想再裝的穩一點的話,可以這樣:

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

有符號左移(<<)

有符號左移會將32位二進制數的所有位向左移動指定位數。如:

var num = 2; // 二進制10
num = num << 5; // 二進制1000000,十進制64

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

function power(n) { return 1 << n;}power(5); // 32

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

有符號右移(>>)

有符號右移會將32位二進制數的所有位向右移動指定位數。如:

var num = 64; // 二進制1000000
num = num >> 5; // 二進制10,十進制2

求一個數的二分之一:

var num = 64 >> 1; // 32

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

無符號右移(>>>)

正數的無符號右移與有符號右移結果是一樣的。負數的無符號右移會把符號位也一起移動,而且無符號右移會把負數的二進制碼當成正數的二進制碼:

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

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

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

-1>>>0雖然沒有向右移動位數,但-1的二進制碼已經變成了正數的二進制碼:

11111111111111111111111111111111

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

總結

以上的例子在平??赡軙容^容易用到或看到,也是屬于比較容易理解的。一些比較復雜的、難理解的,我覺得應該盡量少用,因為會給閱讀者帶來困難,也會給自己帶來麻煩。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕欧美日韩va免费视频| 欧美国产高跟鞋裸体秀xxxhd| 久久久久久久久久久免费精品| 在线成人激情视频| 亚洲精品一区中文字幕乱码| 欧美国产日韩精品| 成人性生交xxxxx网站| 久久久噜久噜久久综合| 日韩黄色av网站| 九九热精品视频国产| 日韩欧美aaa| 国产精品偷伦免费视频观看的| 日韩精品免费在线视频观看| 亚洲精品久久久一区二区三区| 久久伊人精品一区二区三区| 韩国福利视频一区| 中文字幕亚洲一区在线观看| 亚洲成年网站在线观看| 日韩精品在线视频观看| 成人精品一区二区三区电影黑人| 亚洲午夜国产成人av电影男同| 成人国产精品av| 97精品国产aⅴ7777| 一区二区三区高清国产| 国产va免费精品高清在线观看| 亚洲电影免费观看高清完整版在线观看| 色悠悠久久88| 国产精品国产亚洲伊人久久| 欧美日韩xxx| 欧美性猛交xxxx富婆| 欧美国产亚洲精品久久久8v| 色婷婷av一区二区三区在线观看| 久久久免费观看视频| 精品亚洲永久免费精品| 青青草原成人在线视频| 日韩欧美福利视频| 国产99久久久欧美黑人| 久久九九热免费视频| 欧美一级黑人aaaaaaa做受| 国产成人精品一区二区在线| 91系列在线播放| 久久激情视频免费观看| 欧美激情在线有限公司| 亚洲大胆美女视频| 色综合久久精品亚洲国产| 国产精品久久电影观看| 欧美在线视频一二三| 欧美日韩国产色| 97成人在线视频| 国产精品三级在线| 国产一区二区三区在线| 中文字幕一区二区精品| xxav国产精品美女主播| 精品人伦一区二区三区蜜桃网站| 亚洲香蕉在线观看| 搡老女人一区二区三区视频tv| 国产福利视频一区| 97国产suv精品一区二区62| 美女999久久久精品视频| 91精品久久久久久久久久另类| 日韩av在线高清| 日韩精品久久久久久久玫瑰园| 精品久久久在线观看| 国产噜噜噜噜噜久久久久久久久| 日韩av男人的天堂| 欧美一级视频一区二区| 亚洲国产欧美一区二区丝袜黑人| 青青久久av北条麻妃黑人| 大胆人体色综合| 精品国产网站地址| 九九热视频这里只有精品| 久久精品国产清自在天天线| 国产精品免费久久久久久| 日韩中文视频免费在线观看| 97国产在线观看| 国产精品电影网| 久久av资源网站| 国产精品高潮呻吟视频| 亚洲精品国产欧美| 国产精品电影观看| 亚洲色图第一页| 性色av一区二区三区红粉影视| 欧美成年人视频网站欧美| 一区二区三区视频免费| 欧美成人精品xxx| 亚洲免费成人av电影| 国产精品欧美日韩久久| 中文字幕精品在线| 91豆花精品一区| 亚洲一区二区三区香蕉| 亚洲女人天堂色在线7777| 久久人人爽亚洲精品天堂| 久久国产视频网站| 精品自在线视频| 国产精品r级在线| 韩国v欧美v日本v亚洲| 揄拍成人国产精品视频| 精品视频中文字幕| 日韩视频第一页| 成人性生交大片免费观看嘿嘿视频| 日本三级久久久| 色婷婷av一区二区三区在线观看| 日韩在线一区二区三区免费视频| 97在线视频免费播放| 成人免费视频a| 成人福利视频网| 亚洲一二在线观看| 亚洲国产精品免费| 亚洲bt欧美bt日本bt| 91精品国产网站| 中文字幕日韩视频| 久久精品国产免费观看| 国产精品扒开腿爽爽爽视频| 久久在线精品视频| 久久久久国产精品一区| 亚洲在线一区二区| 亚洲成人在线视频播放| 欧美精品日韩www.p站| 欧美日韩亚洲一区二区三区| 91视频九色网站| 亚洲在线免费视频| 亚洲精品av在线| 精品久久久久久久久久国产| 欧美午夜精品久久久久久浪潮| 777午夜精品福利在线观看| 久久精品99久久久久久久久| 日韩欧美中文第一页| 亚洲国产高清福利视频| 夜夜嗨av一区二区三区免费区| 欧美激情免费在线| 午夜精品久久久久久久男人的天堂| 欧美性理论片在线观看片免费| 欧美日韩亚洲一区二区三区| 久久久免费av| 在线观看视频99| 国产精品一区二区三区在线播放| 国产精品欧美激情在线播放| 国产精品久久一| 欧美—级高清免费播放| 亚洲精品www久久久| 日韩成人激情视频| 欧美性xxxx| 欧美视频中文字幕在线| 日韩欧美在线网址| 亚洲**2019国产| 96pao国产成视频永久免费| 97久久精品人搡人人玩| 国产在线拍揄自揄视频不卡99| 精品视频久久久久久| 欧美成人免费va影院高清| 亚洲男子天堂网| 日产精品久久久一区二区福利| 亚洲www永久成人夜色| 欧美在线视频网站| 欧洲成人在线视频| 国产精品一区二区三区久久久| 久久久国产影院| 日本国产精品视频| 日韩av中文字幕在线免费观看| 亚洲欧美日本另类| 久久国产天堂福利天堂| 性色av一区二区咪爱| 国产欧美一区二区三区视频| 国产999在线|