1.给定两个有符号32位整数a和b,返回a和b中较大的
a * returnA+b*returnB ---------returnA与returnB互斥,可用加法表达if else
返回a的条件:
(1)if(a和b符号不相同):a>0 返回a
(2)if(a和b符号相同):a-b>=0 返回a
//请保证参数n,不是1就是0的情况下
//1-->0
//0-->1
public static int flip(int n) {
return n ^ 1;//按位异或
}
//n是非负数,返回1
//n是负数,返回0
public static int sign(int n) {
return flip((n >> 31) & 1);
}
//不考虑越界的解法
public static int getMax1(int a, int b) {
int c = a - b;
int scA = sign(c);//a-b为非负,scA为1;
int scB = flip(scA);//scA为0,scB为1;
//scA为0,scb必为1;scA为1,scB必为0
return a * scA + b * scB;
}
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 difSab = sa ^ sb;//a和b的符号不一样,为1,一样为0
int sameSab = flip(difSab);//a和b的符号不一样,为0,一样为1
int returnA = difSab * sa + sameSab * sc;//返回a的条件:ab不一样且a是正的,ab一样且a-b>0
int returnB = flip(returnA);
return a * returnA + b * returnB;
}
public static void main(String[] args) {
int a = -16;
int b = 1;
System.out.println(getMax1(a, b));
System.out.println(getMax2(a, b));
a = 2147483647;
b = -2147480000;
System.out.println(getMax1(a, b)); // wrong answer because of overflow
System.out.println(getMax2(a, b));
}
2.给定32位正数,判断是否是2的幂,是否是4的幂
public static boolean is2Power(int n) {
return (n & (n - 1)) == 0;
}
//要满足n二进制只有一个1的情况,也就是n & (n - 1)) == 0
public static boolean is4Power(int n) {
return (n & (n - 1)) == 0 && (n & 0x55555555) != 0;
}
3.加减乘除
(1)加
public static int add(int a, int b) {
int sum = a;
while (b != 0) {
sum = a ^ b;
b = (a & b) << 1;
a = sum;
}
return sum;
}
(2)减
public static int negNum(int n) {
return add(~n, 1);
}
public static int minus(int a, int b) {
return add(a, negNum(b));
}
(3)乘
public static int multi(int a, int b) {
int res = 0;
while (b != 0) {
if ((b & 1) != 0) {
res = add(res, a);
}
a <<= 1;
b >>>= 1;
}
return res;
}