位运算(2)
1. 给定两个整数a,b。 问如何不用第三个变量,交换a b的值?
解答:a = a^b;
b = a^ b;
a = a^b;
2、给定 2 个32位 整数a和b ,返回其中较大的值,但是不能用任何比较运算。
package Leet_Code; /** **/ public class BitMax { public static int flip(int n){ // n取0 或 1。若取其他数,则只会翻转最后一位。 return n^1; } public static int sign(int n){ // 取一个32位整数的符号 // 此处用到了flip翻转操作。 // 负数 1: 1-->0 // 非负数: 0 : 0--->1 return flip((n>>31) & 1); } public static int getMax(int a,int b){ int c = a-b; int scA = sign(c); int scB = flip(scA); return a*scA + b*scB; } public static void main(String[] args) { System.out.println(getMax(3,9)); System.out.println(getMax(3,-9)); System.out.println(getMax(3,0)); System.out.println(getMax(0,0)); } }
但是,如果a-b溢出,则会出现计算错误。
改进:如果a \ b同号,则绝对不会溢出,方法类似上边。如果 a \b 异号,则返回正的即可。代码综合起来。
public static int getMax2(int a,int b){ int c = a-b; int sa = sign(a); int sb = sign(b); int sc = sign(c); int difab = sa^sb; int sameab = flip(difab); int returnA = difab * sa + sameab * sc; int returnB = flip(returnA); return a*returnA + b*returnB; }