Java 位运算超全面总结(以及Koltin)

291 阅读3分钟

www.jianshu.com/p/416dd46de…

// 位运算基础操作

//对于任意整数 a 和 b,以下表达式的结果均为 true,各位读者朋友可自行验证,真不骗你!
//注意以下几个操作之所以一一在这里特别列出,是因为它们对于位操作而言具有某种普遍意义,也就是说你最好能将它们牢记于心。
//至于它们有怎样的普遍意义,留给读者们自行思考,总之记住实践出真知!
a|0 == a;
a&-1 == a;
a&0 == 0;

a^a == 0;
a^0 == a;

a|~a == -1;
a&~a == 0;
a&a == a;
a|a == a;

a|(a&b) == a;
a&(a|b) == a;
// 1. 判断奇偶
public void isOddOrEven(int n){
    if ((n & 1) == 1) {//n是奇数
        System.out.println("Odd");
    } else {//n是偶数
        System.out.println("Even");
    }
}
// 2. 省去中间变量交换两整数的值(据说面试常考)
public void swap() {
    int a = 1, b = 2;
    a ^= b;
    b ^= a;//b == 1
    a ^= b;//a == 2
    System.out.println("a:" + a);//a:2
    System.out.println("b:" + b);//b:1
}
// 3. 变换符号,正变负,负变正
public void negate() {
    int a = -10, b = 10;
    System.out.println(~a + 1);//10
    System.out.println(~b + 1);//-10
}
// 4. 求绝对值
public int abs(int a) {
    int i = a >> 31;//得到符号位,0 为正数,-1 为负数
    return i == 0 ? a : (~a + 1);//符号位为 0 直接返回,否则返回 ~a + 1
}
// 4. 求绝对值
public int abs(int a) {
    return a ^ (a >> 31)) - (a >> 31);
}
// 5. 判断一个数num是不是 2 的幂
fun isPowerOfTwo(num: Int): Boolean {
    if (num < 1) {
        return false
    }
    return num.and(num - 1) == 0
}
// 6. 判断一个数num是不是 4 的幂
// 7. int 型最大值是什么?
System.out.println((1 << 31) - 1);// 2147483647, 注意运算符优先级,括号不可省略
System.out.println(~(1 << 31));// 2147483647

// 8. int 型最小值是什么?
System.out.println(1 << 31);
System.out.println(1 << -1);

// 9. long 型最大值是什么?
System.out.println(((long)1 << 127) - 1);

// 10. 整数n乘以2是多少?
n << 1;

// 11. 整数n除以2是多少?(负奇数的运算不可用)
n >> 1;

// 12. 乘以2的n次方,例如计算10 * 8(8是2的3次方)
System.out.println(10<<3);

// 13. 除以2的n次方,例如计算16 / 8(8是2的3次方)
System.out.println(16>>3);

// 14. 取两个数的最大值(某些机器上,效率比a>b ? a:b高)
System.out.println(b&((a-b)>>31) | a&(~(a-b)>>31));

// 15. 取两个数的最小值(某些机器上,效率比a>b ? b:a高)
System.out.println(a&((a-b)>>31) | b&(~(a-b)>>31));

// 16. 判断符号是否相同(true 表示 x和y有相同的符号, false表示x,y有相反的符号。)
System.out.println((a ^ b) > 0);

// 17. 计算2的n次方 n > 0
System.out.println(2<<(n-1));

// 18. 求两个整数的平均值
System.out.println((a+b) >> 1);

// 19. 从低位到高位,取n的第m位
int m = 2;
System.out.println((n >> (m-1)) & 1);

// 20. 从低位到高位.将n的第m位置为1,将1左移m-1位找到第m位,
//得000...1...000,n 再和这个数做或运算
System.out.println(n | (1<<(m-1)));

// 21. 从低位到高位,将n的第m位置为0,将1左移m-1位找到第m位,
//取反后变成111...0...1111,n再和这个数做与运算
System.out.println(n & ~(0<<(m-1)));

// 22 暂时木有了,想到再加~