算法--位运算的运用(持续更新)

这篇博客介绍了位运算在解决编程问题时的几种实用技巧。第一种应用是通过异或操作找到数组中只出现一次的数。第二种是判断一个数是否为2的次方,通过与(n-1)按位与来实现。第三种是利用位运算检查两个字符串是否有相同的字母。第四种是确定二进制表示中最高位的1,并计算数的补数。这些方法展示了位运算在提高代码效率和简化问题解决过程中的作用。
摘要由CSDN通过智能技术生成

前言:

今天看书,看到位运算的介绍,哇,发现位运算可有用,不过还不是很理解,记录下来

用法一

在不开数组的情况下,找一列数中只出现一次的数:

利用

num^num = 0; num^0 == num;

先初始化一个变量num = 0,再一个个的用数组里的数跟该数异或。

不过,我觉得应该是还有位运算可以交换运算顺序的缘故。

题目链接

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for (int i=0; i<nums.size(); i++)
        {
            ans^=nums[i];
        }    
        return ans;
    }
};

用法二

判断是否为2的次方

如果一个数是2的次方,那么该数的二进制数肯定为以下形式

0000..100....

然后将该数设为n, 则n-1为

0000...11....

两数按位与,则等于零

n&(n-1) = 0;  //来判断一个数是否为2的次方 

书上还有可以来判断是否为4的次方,是这么说的,

如果这个数也是 4 的次方,那二进制表示中 1 的位置必须为奇数位。我们可以把 n 和二进制
10101...101 (即十进制下的 1431655765 )做按位与,如果结果不为 0 ,那么说明这个数是 4 的次方。

说明可以利用

n > 0 && !(n & (n - 1)) && (n & 1431655765);  //来判断是否为4的次方

对于这个判断,我还不是很理解,能有大佬能解释一下吗?

用法三

判断两个字符串,是否出现相同的字母

为每个字符串的26个字母建立一个长度为26的二进制数,然后将两个数按位与,若按位与为0,则两个字符串中没有相同的字母。

用法四

求二进制表示数的1在的最高位

        int highbit=0;
        for (int i=0; i<=30; i++)
        {
            if ((1<<i)&num)
            highbit = i;
        }

将一个二进制表示的数置为000...11111

(1<<(highbit+1))-1

求一个数的补数

题目链接

class Solution {
public:
    int findComplement(int num) {
        int highbit=0;
        int ans=0;
        for (int i=0; i<=30; i++)
        {
            if ((1<<i)&num)
            highbit = i;
        }
        ans = highbit==30 ? 0x7fffffff: (1<<(highbit+1))-1;
        return ans^num;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值