位运算
参考自郑未老师的算法课,侵删。
基础知识
&
(与)、|
(或)、^
(异或)、~
(非)>>
和<<
运算符将二进制位进行右移或者左移操作- 对于
int
型,1<<35
与1<<3
是相同的 - 与:都为1结果为1,或:有一个为1结果为1,异或:二者不同时结果为1
题1
思路:
// 假设有11个数,7为重复的数字,像下面一顿操作,就只剩下7了
// 因为 A^A=0, A^0=A
1^2^3^4^5^6^7^7^8^9^10^(1^2^3^4^5^6^7^8^9^10) = 7
题2
思路:和上一题一样
题3
解法一:1左移i位,然后与num作与运算(num右移同理)
var num = 9;
var count = 0;
for (var i = 0; i < 32; i++) {
// .... 1001
//&.... 0001
// .... 0001
if ((num&(1<<i)) === (1<<i)) {
count++;
}
}
console.log(count); // 2
解法二:x&(x-1) 会消掉最右边的1
var num = 9;
var count = 0;
while(num !== 0) {
num = num&(num-1);
count++;
}
console.log(count);
题4
思路:
2的整数次方,比如8,16,用二进制表示都只有一个1。
那么这道题就转化为判断一个整数的二进制是否只有一个1。
题5
代码:
var num = 9;
var ou = num&0xaaaaaaaa;
var ji = num&0x55555555;
console.log((ou>>1)^(ji<<1)); // 6