【算法】【优选算法】位运算(上)


一、位运算简介及常用操作

基础位运算:

右移:>>
左移:<<
按位取反:~
按位与:& :有0就是0
按位或:| :有1就是1
按位异或 :^ :相同为0 ,相异为1。或者无进位相加

位运算符的优先级:

加括号吧,记不住

给一个数n确定他的二进制表示的第x位(二进制表示从右向左从第一位是0)是0还是1:

将这个数先向右移x位,再与1按位与,是0第x位就是0,是1第x位就是1。
n = (n >> x) & 1

将一个数n的二进制表示的第×位修改成1:

将这个数第x位按位或上1,其余按位或上0就行
n = n | (1 << x)

将一个数的二进制表示的第×位修改成0:

将这个数的第x位按位与上0,其余按位与上1就行
n = n & ( ~ (1 << x) )

位图的思想:

本质就是哈希表,只不过是使用一个int的32个比特位里面存储0和1。

提取一个数(n)二进制表示中最右侧的1:

取相反数就是:先按位取反,再加一。本质就是将最右侧的1到最左侧区域全部取反
n & -n

干掉一个数()二进制表示中最右侧的1:

n-1 就是将二进制最右侧的1到最右侧区域全部取反
n & n-1

异或(^)运算的运算律

a ^ 0 = a
a ^ a = 0
a ^ b ^ c = a ^ ( b ^ c )

二、191.位1的个数

题目链接:191.位1的个数

题目描述:

题目解析:

  • 就是返回一个正数的二进制表示中1的个数。

解题思路:

  • 直接该数第0位按位与上1,判断是不是1。
  • 然后该数向右移动一位。循环到数变为0即可。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {
   
    public int hammingWeight(int n) {
   
        int ret = 0;
        while(n != 0) {
   
            ret += n & 1;
             n = n >> 1;
        }
        return ret;
    }
}

三、338.比特位

评论 168
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸽鸽程序猿

蟹蟹大哥

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值