位運算子是在數字底層(表示數字的32個數字)上進行操作的。
所有整數字面量都是有符號整數,用31位表示數值,用第32位表示符號,0表示正數1表示負數。數值範圍從-(2^31 - 1)到(2^31 - 1)。注意位0的位置在最右側。
正數是以真二進位制形式儲存的,前 31 位中的每一位都表示 2 的冪,從第 1 位(位 0)開始,表示 2^0,第 2 位(位 1)表示 2^1。沒用到的位用 0 填充,即忽略不計。
var num = 18;
(num).tostring(2); //10010(18 = 2^4+2^1)
負數也儲存為二進位制**,不過採用的形式是二進位制補碼直接來例子,求-18的補碼
(1)求該數字非負版本的二進位制。這裡也就是18的二進位制(10010)
(2)求二進位制反碼,也就是1變成0,0變成1(1111 1111 1111 1111 1111 1111 1110 1101)
(3)在反碼的基礎上加一,注意二進位制裡的運算1+1=10(1111 1111 1111 1111 1111 1111 1110 1110)
但是呢,ecmascript並不以這種二進位制補碼來表示負數,而是用數字絕對值的標準二進位制**前面加上負號的形式輸出。
//諾,就是這樣
var num = -18;
(num).tostring(2); //-10010,「-18的顯示就是這樣的」
保持數字對齊,用上述規則然後進行與運算。
保持數字對齊,用上述規則然後進行或運算。
其實就是對數字求負,然後減一
var num = 25;
var num1 = ~num;
num1; //-26
滿**換律,乙個數和自己異或的結果是0,任何數x與0異或的結果都是本身x,任何數x與-1異或的結果都是-x。
var old = 2; //10
var new = old << 5; //1000000
(1)判斷奇偶(貌似很實用啊)
//一般都是(i % 2 !== 0)來判斷奇數
if(i & 1) else
(2)交換兩個數字
一般需要乙個中間變數,
var temp = a;
var a = b;
var b = temp;
可以用位操作符實現交換不需要中間變數
a ^= b; //a = a ^ b
b ^= a; //b = b ^ a = b ^ a ^ b = a (b = a)
a ^= b; //a = a ^ b = a ^ b ^ a = b;
(3)變換符號
只需要求反後加1即可
function rever (n) //11 => -11
(4)求絕對值
對於負數對其取反後加1來得到正數。先移位取得符號位i >> 31
var i = a >> 31 //如果a為正數,i為0。如果a為負數,i為-1
return i == 0 ? a : (~a + 1); //正數保持不變,負數變換符號。
另一種方法
可以通過異或,參考異或的規則。a與i異或後減i(即加0或者加1)
var i = a >> 31;
return (a ^ i) - i;
位運算的簡單原理
1.異或 xor bitwise xor 1 0 1 1 1 0 0 0 0 0 1 1 簡單來說一樣的為0,不一樣為1 if a b 0 then a和b異號 例如 5 7 5的二進位制為 101 7的二進位制為 111 異或運算結果 010 轉為二進位制為2 需要注意的是 對於負數要按照補碼 負...
位運算及簡單應用
老實說,我對 一些比較簡單的運算子比較熟悉。對位運算就陌生了,主要用的少。我覺得高手用的會比較多,因為位運算速度比較快。1.如果兩個相應的二進位制位都為 則該位的結果值為1 否則為0。注 下面都用8位的 unsigned char 來做例子。11 3 3 00001011 00000011 0000...
位運算 簡單 476 數字的補數
題目 給你乙個 正 整數 num 輸出它的補數。補數是對該數的二進位制表示取反。示例 1 輸入 num 5 輸出 2 解釋 5 的二進位制表示為 101 沒有前導零位 其補數為 010。所以你需要輸出 2 示例 2 輸入 num 1 輸出 0 解釋 1 的二進位制表示為 1 沒有前導零位 其補數為 ...