位运算的使用

什么是位运算

程序中的所有数在计算机内存中都是以二进制的形式储存的

位运算:直接对整数在内存中的二进制位进行操作

由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快

实战常用的位运算操作

if (x & 1) {
  console.log("x 为奇数");
}

// 清除最低为的 1			a100	&	a011	=	a000
let x = 112   // 111 0000 
x = x & (x - 1) // 111 0000  & 110 1111  = 110 0000
console.log(x); // 96

// 得到最低为的 1			a100	&	取反a100	=	100
let x = 112   // 111 0000 
x = x & -x // 111 0000  & 001 0000 (取反,+1) = 1 0000
console.log(x); // 16

n & (n - 1) 清除最后一位 1

假设 n n n 的二进制表示: ( a 10...0 ) 2 (a10...0)_2 (a10...0)2

n − 1 n - 1 n1 的二进制表示: ( a 01...1 ) 2 (a01...1)_2 (a01...1)2

n & ( n − 1 ) n \& (n - 1) n&(n1)​​ = a 00...00 a00...00 a00...00​​

n & (-n) 获取最低位的 1

假设 n n n 的二进制表示: ( a 10...0 ) 2 (a10...0)_2 (a10...0)2

− n -n n​ 的二进制为 n n n​ 取反加1 : ( a ˉ 01...1 ) 2 + ( 1 ) 2 = ( a ˉ 10...0 ) 2 (\bar{a}01...1)_2 + (1)_2 = (\bar{a}10...0)_2 (aˉ01...1)2+(1)2=(aˉ10...0)2

n & ( − n ) n \& (-n) n&(n)​ = 10...00 10...00 10...00

191. 位1的个数
var hammingWeight = function(n) {
  let r = 0
    while (n) {
      n &= n - 1
      r++
    }
  return r
};
231. 2 的幂
var isPowerOfTwo = function(n) {
  return n > 0 && (n & n - 1) == 0
  // return n > 0 && (n & -n) == n;
};
338. 比特位计数
var countBits = function(n) {
  const res = new Array(n + 1).fill(0)
  for (let i = 1; i <= n; i++) {
    res[i] = res[i & i - 1] + 1
  }
  return res
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值