簡單的學習位運算

2021-09-17 02:19:03 字數 1832 閱讀 5354

位運算子是在數字底層(表示數字的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 沒有前導零位 其補數為 ...