位运算的技巧

1. 找到一个整数的二进制中最后一位1的位置:

int split = a&(a-1)^a; 

int split = a&~(a-1);

注意split不是位置。 

2. 将一个数的最后一位1变为0

n=n&(n-1)

 3. 一个整数的二进制中1的个数

int res = 0;
while (n!=0) {
    res++;
    n = n&(n-1);
  }
return res;

4.  判断一个数是不是2的幂次;

两个条件:大于0;且二进制中只有一个1(那么将最后一个1去掉之后不就是0了吗

5. 判断最后一位数是不是1

n & 1 == 1

6.关于负数的右移左移:

1.负数的右移:需要保持数为负数,所以操作是对负数的二进制位左边补1。如果一直右移,最终会变成-1,即(-1)>>1是-1。
2.负数的左移:和整数左移一样,在负数的二进制位右边补0,一个数在左移的过程中会有正有负的情况,
所以切记负数左移不会特殊处理符号位。如果一直左移,最终会变成0。

7.  位运算求和

     两个数异或:相当于每一位相加,而不考虑进位;

     两个数相与,并左移一位:相当于求得进位;

public int Add(int num1,int num2) {
    while( num2!=0 ){
        int sum = num1 ^ num2;
        int carray = (num1 & num2) << 1;
        num1 = sum;
        num2 = carray;
    }
    return num1;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值