位运算算法总结
- 位运算符:
&(与):两者都为1才为1
|(或):有一个是1就是1
~(非):取反
^(异或):两者不同才为1
(完成)交换x,y的值(不使用中间值tmp)
法一:
x = x+y;//有可能越界
y = x-y;
x = x-y;
法二:
x = x^y;//x被y异或两次还等于x本身
y = x^y;
x = x^y;
(完成)二进制中1的个数
public class Solution_11 {
public static int NumberOf1(int n) {
int count = 0;
while(n!=0){
count ++;
n = n&(n-1);
}
return count;
}
}
判断一个数是否为2的n次幂
package yanyingnan.baodian.bit;
/*判断一个数是否为2的n次幂*/
public class Solution_01 {
/*public static boolean is2n(int n){
if(n<1)
return false;
int i=1;
while(i<=n){
if(n==i)
return true;
i<<=1;
}
return false;
}*/
public static boolean is2n(int n){
if(n<1)
return false;
return (n&(n-1)) == 0;
}
public static void main(String[] args) {
System.out.println(is2n(8));
}
}
求两个整数之和
package neu.yanyingnan.offer;
public class Solution_48 {
public int Add(int num1,int num2) {
if(num2 == 0)
return num1;
int sum;
int carry;
sum = num1 ^ num2;
carry = (num1 & num2) << 1;
return Add(sum, carry);
}
}
求1+2+3+…+n
package neu.yanyingnan.offer;
/*题目描述
求1+2+3+...+n,
要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。*/
public class Solution_47qqqqq {
public int Sum_Solution(int n) {
return (int)Math.pow(n, 2)+n >> 1;//(n^2+n)/2
}
}