巧用位運算

2021-09-27 21:39:30 字數 852 閱讀 6997

1、用乙個表示式,判斷乙個數x是否是2的n次方(2,4,8,16.....),不可用迴圈語句。

解析:x:2,4,8,16轉化成二進位制是10,100,1000,10000。如果減1則變成01,011,0111,01111。兩者做按位與運算,結果如果為0,則x是2的n次方。

答案:!(x&(x-1))

2、統計乙個整數的二進位制中1的個數

int countnumberofone(int number)

return counter;

}

3、對於集合的表示(類似於bitmap,位圖)

大多數時候,我們可以用乙個整數來表示乙個包含不超過32(當然如果使用64位整型變數也可以是64個)個元素的集合——對於每乙個位,如果元素為1,則表示存在當前位所對應的集合成員,如果是0,則表示這個集合成員是不存在的。

比如a=1011 就可以表示集合,而上面提到的1<4、元素交換,不使用第三個變數

swap(a, b)

5、低位提取技術

我們對於乙個非0數x,現在提取出其最低位的1。三種不同的寫法。

lowbit(x)=x&(x^(x-1))

lowbit(x)=x&~(x-1)

lowbit(x)=x&-x

注意:這裡我們求出的是x中最後乙個1表示的數,而非其位置。

可以發現,這三種低位函式的寫法可謂大同小異——均涉及到了x&和x-1(其實 –x 可以認為是和 ~(x-1) 等價的,這裡利用了負數的儲存原理)。

x-1的性質在於:其將乙個數最後乙個1變成了0,並把原來這個1之後0的位置均變成了1。低位技術正是利用了這個性質。

巧用位運算

1 不用額外空間交換兩個數字變數的值 解1 異或運算 只能交換整數 var a 3 var b 4 a a b a 7 b a b b 3 a a b a 4解2 加減法運算 非整數存在精度問題 var a 3 var b 4 a a b a 7 b a b b 3 a a b a 4解3 利用乘除...

巧用JS位運算

1.使用按位非 判斷索引存在 這是乙個很常用的技巧,如判斷乙個數是否在陣列裡面 如果url含有?號,則後面拼上 符號,否則加上?號 url url indexof 因為 1 0 1在記憶體的表示的二進位制符號全為1,按位非之後就變成了0.進一步說明 1在記憶體的表示為 0000.0001,第一位0表...

巧用JS位運算

位運算的方法在其它語言也是一樣的,不侷限於js,所以本文提到的位運算也適用於其它語言。位運算是低階的運算操作,所以速度往往也是最快的 相對其它運算如加減乘除來說 並且借助位運算的特性還能實現一些演算法。恰當地使用運算有很多好處。下面舉幾個例子。這是乙個很常用的技巧,如判斷乙個數是否在陣列裡面 如果u...