详解位运算解题套路

本文详细介绍了位运算在解题中的应用,包括如何利用异或(&)、与(<<)进行加法运算,异或的特殊性质,以及0x55555555和0xaaaaaaaa的妙用。此外,还讲解了n&(n-1)在检测2的幂和改变bit位数上的作用。
摘要由CSDN通过智能技术生成

1.位运算解题技巧

1、使用 x & 1 == 1 判断奇偶数。(注意,一些编辑器底层会把用%判断奇偶数的代码,自动优化成位运算)
2、不使用第三个数,交换两个数。x = x ^ y , y = x ^ y , x = x ^ y。(早些年喜欢问到,现在如果谁再问,大家会觉得很low)
3、两个相同的数异或的结果是 0,一个数和 0 异或的结果是它本身。(对于找数这块,异或往往有一些别样的用处。)
4、x & (x - 1) ,可以将最右边的 1 设置为 0。(这个技巧可以用来检测 2的幂,或者检测一个整数二进制中 1 的个数,又或者别人问你一个数变成另一个数其中改变了多少个bit位,统统都是它)
5、异或可以被当做无进位加法使用,与操作可以用来获取进位。
6、i+(~i)=-1,i 取反再与 i 相加,相当于把所有二进制位设为1,其十进制结果为-1。
7、对于int32而言,使用 n >> 31取得 n 的正负号。并且可以通过 (n ^ (n >> 31)) - (n >> 31) 来得到绝对值。(n为正,n >> 31 的所有位等于0。若n为负数,n >> 31 的所有位等于1,其值等于-1)
8、使用 (x ^ y) >= 0 来判断符号是否相同。(如果两个数都是正数,则二进制的第一位均为0,x ^ y=0;如果两个数都是负数,则二进制的第一位均为1;x ^ y=0 如果两个数符号相反,则二进制的第一位相反,x ^ y=1。有0的情况例外,^相同得0,不同得1)
9.a-b结果的符号(int 类型),可以用(a-b)>>31得出,-1则是为负,0为正数

2.异或(^)与与(&)左移(<<)做加法运算

在这里插入图片描述
在这里插入图片描述

无进位和 与 异或运算 规律相同,进位 和 与运算 规律相同

那么每异或一次,相当于求一次两数无进位和,每做一次与运算加左移,相当于求出所有进位的和,再与第一次异或的结果再次异或,如此循环,当没有进位时即进位和为0时,代表求出最终结果

C++代码

class Solution {
   
public:
    int add(int a, int b) {
   
        while(b!=0)
        {
   
            int c=(unsigned int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值