
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;
}
1242

被折叠的 条评论
为什么被折叠?



