(简单题 位运算)leetcode 10009

异或运算完成指定有效位取反(注意 带符号整数都是32位每位都会判断不能直接~)

如5:000000……0101

7

和:0000……0111异或

得到000……0 010=2

而且

若n二进制最高位1是第i位则n一定小于第2的i+1

我们找到i的位置,用(1<<i+1)-1和n异或就行

(或者找到第一个大于n的2的i次幂,再用其-1进行异或)

特殊情况

n==0时

我们i要是从0开始判断 1<<0,导致0^0=0

我们i从1开始算或者if(n==0)return 1;

注意区分i是n的有效位数还是有效位数加1

特殊情况n==30

这个只能用1<<31-1进行与运算也就是INT_MAX

2^31不存在溢出

class Solution {
public:
    

int bitwiseComplement(int n) {
  
    int i =1;
    while (i <= 30)
    {
        if (n <(1 << i))
            break;

        i++;
    }
int len=i-1;
    int mask = (len == 30 ? INT_MAX: (1 << (i)) - 1);//判断有效位数长度是不是30
    return n ^ mask;
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值