476. Number Complement - 最高比特位后取反

https://leetcode.com/problems/number-complement/

分析

也即把一个数最高比特位后的比特位取反即可,关键要找出最高比特位,简单的位操作,十几分钟搞定,位操作使用还要加强,神技能啊。

实现一

int findComplement(int num) {
    int i = 0;
    int tmp=0;
    int max=0;
    for(i=0;i<32;i++)
    {
        tmp=0x80000000>>i;
        if((num &tmp) == tmp)
        {
            max=i;
            break;
        }
    }

    num = ~num;
    num &= 0xFFFFFFFF>>max;

    return num; 
}

实现二

int findComplement(int num) {
    int tmp = num;

    /* 将最高位后面的位都置为1 */  
    tmp |= (tmp>>1);
    tmp |= (tmp>>2);
    tmp |= (tmp>>4);
    tmp |= (tmp>>8);
    tmp |= (tmp>>16);

    num = ~num;
    num &= tmp;

    return num; 
}

猜你喜欢

转载自blog.csdn.net/qq_25077833/article/details/54960481