之前一直沒搞懂這個怎麼計算的,主要也因為之前沒怎麼用到過這個,但現在想把它搞懂,所以索性一次性搞懂為妙,以後就不用再糾結了哈。 按位運算符就是把數字看作二進位來進行計算的,並且再把計算出來的二進位給它轉換成十進位,也就是最終的結果了。 比如: 7&9 這個是按位與,先不討論與不與的,總之它現在會把7 ...
之前一直沒搞懂這個怎麼計算的,主要也因為之前沒怎麼用到過這個,但現在想把它搞懂,所以索性一次性搞懂為妙,以後就不用再糾結了哈。
按位運算符就是把數字看作二進位來進行計算的,並且再把計算出來的二進位給它轉換成十進位,也就是最終的結果了。
比如:
7&9
這個是按位與,先不討論與不與的,總之它現在會把7和9轉換成二進位,接下來我們將7和9轉換成2進位,這裡我用python。
如果你看不懂這段代碼沒有關係,因為這裡的重點不是講python,而是按位運算符,這裡我們可以看到7的二進位為111,而9的二進位為1001。明顯可以看出7和9的二進位長度不一樣,如果長度不一樣的話,短的那個前面會自動補0。結果就成了這樣:
7:0111
9:1001
前面說了所謂的按位運算符就是比較兩個數的二進位,那麼怎麼比較呢,是這樣的,如果是按位與那麼就比較兩個數是不是都為1如果是就是1否則為0,看下麵。
比如第一個7:0 ,第一個9:1那麼它們就為0,只要其中有一個是0那麼它就是零,當然這是對於按位於來說的。
整體比較如下:
7:0 1 1 1
9:1 0 0 1
結果:0 0 0 1
那麼結果二進位就成了0001了,那麼二進位0001再轉換成十進位就是1,自然7&9結果就是1。
我們可以用下麵的工具來幫我們轉換。
其他的東西都不要問我,我只說按位運算符,因為其他我啥也不懂,至於轉換來轉換去,我也是百度了一下的,但我的目的達到了,因為我不是來學進位轉換的,有一句話說的很好,不忘初心,方得始終。這也是一種學習方式,以前我學習老愛糾結這些,所以一直就學不好,因為有些根本就不是你現在該考慮的,你要明確自己學這個幹嘛。
那麼按位或,按位非,按位取反,自然也是一個道理,不過是比較的時候換種花樣罷了,再拿按位或來演示一下。
按位或
5|6
轉換2進位:
5:101
6:110
只要有1就是1
結果:111 這是二進位 再轉一下就是7.
我們來看看這個按位運算符有沒有什麼規律。
//轉成二進位
console.log((1).toString(2)); //1
console.log((2).toString(2)); //10
console.log((3).toString(2)); //11
console.log((4).toString(2)); //100
console.log((5).toString(2)); //101
console.log((6).toString(2)); //110
console.log(1&0); //0
console.log(1&1); //1
console.log(1&2); //0
console.log(1&3); //1
console.log(1&4); //0
console.log(1&5); //1
console.log(1&6); //0
這裡可以看出1&任何單數都為1,而1&任何雙數都為0。(包括負數)
console.log(2&0); //0
console.log(2&1); //0
console.log(2&2); //2
console.log(2&3); //2
console.log(2&4); //0
console.log(2&5); //0
console.log(2&6); //2
console.log(2&7); //2
console.log(2&8); //0
console.log(2&9); //0
console.log(2&10); //2
console.log(2&11); //2
console.log(2&12); //0
console.log(2&13); //0
console.log(2&14); //2
console.log(2&15); //2
這裡可以看出2的規律是0 0 2 2 可以口算出來的管理還真沒看出來。
再看一組
console.log(3&0); //0
console.log(3&1); //1
console.log(3&2); //2
console.log(3&3); //3console.log(3&4); //0
console.log(3&5); //1
console.log(3&6); //2
console.log(3&7); //3console.log(3&8); //0
console.log(3&9); //1
console.log(3&10); //2
console.log(3&11); //3console.log(3&12); //0
console.log(3&13); //1
console.log(3&14); //2
console.log(3&15); //3
或
console.log(3|0); //3
console.log(3|1); //3
console.log(3|2); //3
console.log(3|3); //3console.log(3|4); //7
console.log(3|5); //7
console.log(3|6); //7
console.log(3|7); //7console.log(3|8); //11
console.log(3|9); //11
console.log(3|10); //11
console.log(3|11); //11console.log(3|12); //15
console.log(3|13); //15
console.log(3|14); //15
console.log(3|15); //15規律隔4加4.
其他規律就不算了。
ok了,這是一次很愉快的過程,目的達到了哈,按位運算可以告一段落了。
位運算看了半天才看懂T_T ,下麵寫一下位運算的原理吧。
先拿右移>>運算開刷。
如:16>>2 = 4
它的計算是先將16轉成二進位,然後把這個二進位往右移動2個位置。
16的二進位:0001 0000
往右移動兩個就成了0000 0100,為什麼是移動兩個因為我們上面寫的就是2啊,>>後面表示的是你要移動多少位。實際上這裡我們還是看不懂,為什麼前面0001變成了0000了呢?是這樣的:
16>>2表示在16這個二進位前面添加兩個零或者兩個1,至於是添加零還是1取決於>>左邊的這個數是正數還是負數,如果是正數就填補0,如果是負數就填補1。
0001 0000
因為16是正數所以填補0
0000 0100 00 超出了兩個0去掉超出的,因此就是:
0000 0100
再如5>>3=0
5的二進位為:0000 0101
結果:0000 0000
那麼左移位呢?自然相反啊。
比如5<<3=40
5的二進位為:0000 0101
結果:0010 1000
啥意思?就是把0或者一往0000 0101後面補,然後把前面多餘的刪除。
000 0010 1000 前面三個0刪除。
反正就是這樣了,能不能聽懂你自己看著辦吧,就到這了。
網上看到這篇文章還是不錯的:http://www.cnblogs.com/yyangblog/archive/2011/01/14/1935656.html