位运算常见问题

这篇博客介绍了如何使用位运算快速计算一个整数的二进制表示中1的个数,通过公式n&(~n)+1找到最右侧的1。此外,还展示了在数组中找出两个出现奇数次的数字的方法,利用异或运算的性质,最后给出了具体的Java代码实现。
摘要由CSDN通过智能技术生成

求n的二进制中1的个数

首先求出这个数的二进制中除最右侧1的那位不变,其余位都是0。
例如:1110,最右侧是1的那个数是0010,0010是如何得出的呢?
记一个小公式:n&((~n)+1)
n=1110带入即可求出最右侧的1的那位数
1110&((~1110)+1)=1110&(0010)=0010
因此计算n的二进制中1的个数就很容易了

public static int bit1Count(int n){
    int count = 0;
    while(n!=0){
        rightOne = n&((~n)+1);
        count++;
        n^=rightOne;
    }
    return count ;
} 

如果一个array数组中有两种数字是奇数个,其它数字是偶数个,求出这两种数字

异或运算满足交换律结合律,其实就一句话:异或操作与数字运算的顺序无关,任何一个数异或它本身都等于0。

public void printOddNum2(int[] array){
    int eor = 0;
    //假设这两种数字是a b
    for(int i=0;i<array.length;i++){
        eor^=array[i];
    }
    // eor = a^b 只要知道a b中的任何一个就能计算出另一个
    int rightOne = eor&(~eor+1);
    int eor2 = 0;
    // 找这个数二进制的最右侧是1的那位数,因为其他数字是偶数个所以异或之后是0
    for(int i=0;i<array.length;i++){
        if(array[i]&rightOne==0){
        // 与运算结果是0,表示当前数字的二进制第n位是0
            eor2^=array[i];
        }
    }
    System.out.println(eor2);
    System.out.println(eor2^eor);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值