位運算符:javascript
~(NOT)
把運算數轉換爲32位數字–>轉換爲反碼–>轉換爲浮點數
實質上是對數字求負,而後減1: ~25=-26,~-10=9html
&(AND)是對每一個數字中的數位對齊,同一位置的兩個數位進行」與」運算
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
————————————————————————————————————————————
&=0000 0000 0000 0000 0000 0000 0000 0001 = 1java
|(OR)
是對每一個數字中的數位對齊,同一位置的兩個數位進行」或」運算
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
————————————————————————————————————————————
|=0000 0000 0000 0000 0000 0000 0001 1011 = 27dom
^(XOR)
是對每一個數字中的數位對齊,同一位置的兩個數位進行」異或」運算
25=0000 0000 0000 0000 0000 0000 0001 1001
3=0000 0000 0000 0000 0000 0000 0000 0011
————————————————————————————————————————————
^=0000 0000 0000 0000 0000 0000 0001 1010 = 26函數
<<(左移)
是把全部位數(除了符號位)向左移制定數量,空位用0填充;
2=0000 0000 0000 0000 0000 0000 0000 0010
————————————————————————————————————————————
<<5=0000 0000 0000 0000 0000 0000 0100 0000=64spa
>>(有符號位右移)
是把全部位數(除了符號位)向右移制定數量,空位用0填充;
64=0000 0000 0000 0000 0000 0000 0100 0000
————————————————————————————————————————————
>>5=0000 0000 0000 0000 0000 0000 0000 0010=2code
相似的運算符 &&,||,!他們只運用在boolean運算中,而不是位運算。htm
位運算基於數值數據也就是咱們剛纔提到的"integer"(被從64-bits floating point 通過 Toint32方法轉化而來的32-bits integer),位運算結束後再被轉化成雙精度浮點型。blog
Toint32咱們不能調用,也很差猜想內部的實現邏輯,咱們將它的規律總結以下:ip
一、忽略全部的小數部分
二、若是超出了32位整型能存儲的範圍,結果是1的二進制補碼(即-1)
三、若是是一個小於1的小數,結果是0
四、若是是Infinity(不管正無窮仍是負無窮)或者NAN,結果是0
五、若是是true返回一、false返回0
實際上javascript的位運算符並非最快的,由於他們被限制爲32位,並且須要從雙精度浮點型轉換而來而且再轉化回去,儘管如此他們比傳統的操做符要快,由於他們更接近於底層。
下面是和0進行 Or操做的結果,這充分驗證了Toint32函數和位運算的內部原理。
-1.6 | -0 | +0 | 1 | 1.6 | 8 | 16 | 16.8 | 123e-2 | -Infinity | +Infinity | NaN | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
col|0 | -1 | 0 | 0 | 1 | 1 | 8 | 16 | 16 | 1 | 0 | 0 | 0 |
"" | "-1.6" | "0" | "1" | "1.6" | "8" | "16.8" | "123 e-2" |
"010" (Octal) |
"0x10" (Hex) |
"0xFF" (Hex) |
"-010" | "-0x10" | "xx" | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
col|0 | 0 | -1 | 0 | 1 | 1 | 8 | 16 | 1 | 10 | 16 | 255 | -10 | 0 | 0 |
undefined | null | true | false | new Object() | function(){ return; } |
|
---|---|---|---|---|---|---|
col|0 | 0 | 0 | 1 | 0 | 0 | 0 |
代碼:
var a = "10"| 0 ; console.log("Bitwise Or a is : " +a); var b = "s1132"|0; console.log("Bitwise Or b is : " +b); var c = [1,3,2]&1 ; console.log("Bitwise And c is : " +c); var d = [1]|0; console.log("Bitwise Or d is : " +d); var e = ~function(){}(); console.log("Bitwise Not e is : " +e); var f = ({})|0; console.log("Bitwise Or f is : " +f); var g = ([1])|0; console.log("Bitwise Or g is : " +g); var h = "1ss"^0; console.log("Bitwise Exclusive Or h is : " +h);
var arr=[1,2,3,4,5]; console.log(arr|0); //0 var arr=[6]; console.log(arr|0); //6
http://www.cnblogs.com/wisdomoon/p/3338327.html
http://www.hehe0.com/javascript-wei-yun-suan-xiao-ji/