Java初涉之10--Java位运算

参考资料:

http://www.52ij.com/jishu/102.html

// 判断(int)奇偶
public static boolean isOdd(int num) {
    return (num & 1) == 1 ? true : false;
}
// 求平均值
// x&y 获取x 和 y中都是都为1或者都为0的,相加再除以2是不变的,所以先获取这一部分
// 5 --- 101 = 100 + 1
// 4 --- 100 = 100 + 0
// x^y 获取x 和 y中不一样的部分,这一部分再除以2
public static int countAvg(int x, int y) {
    return (x & y) + ((x ^ y) >> 1);
}
/** * x和相邻的x-1都取相同的部分最终的结果是0 * 如果一个数是2的幂次方,则其转换为二进制是100...0 * 所以其减去1得到的是011..1 * 两者求并,得到的是0,必要性 * 充分性:-1后所有位的数字都会变化,则末尾一定是0,依次类推除了最高位是1,其余都是0 * @param x * @return */
public static boolean isPower(int x) {
    return ((x & (x - 1)) == 0) && (x != 0);
}
/** * 比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效 * x = x ^ y; x^y 获取x 和 y中不一样的部分 * y = y ^ x; 再和y异或就是与y不一样,就是x * x = x ^ y; 再和y异或不一样,就是y *  @param x *  @param y */
public static void swap(int x,int y){
    System.out.println("X:"+x+";"+"Y:"+y);
    x ^= y;  //x = x ^ y; 
    y ^= x;  //y = y ^ x; 
    x ^= y;  //x = x ^ y;
    System.out.println("X:"+x+";"+"Y:"+y);
}
 /** * 求绝对值 * @param x */
 public static int abs(int x) {
     int y;
     y = x >> 31;
     return (x ^ y) - y;     // or: (x+y)^y
 }
 /** * 取模运算,采用位运算实现: * * @param x * @return */
 public static int mod(int a,int n){
     //a % (2^n) 等价于 
     return a & (2^n - 1) ;
 }
/** * * 求相反数(~x+1) * * @param x * @return */
public static int unm(int x){
    return (~x+1);
}
/** * 加法 */
int Add(int a, int b)
{
  return b!=0 ? Add(a^b, (a&b)<<1) : a;
}

你可能感兴趣的:(java,位运算)