1、位运算:给定两个有符号32位整数(符号位在最高位),返回a和b中较大的。
package day;
public class GetMax {
public static int sign(int n) {//n为正数,返回1;n为负数,返回0
return flip((n>>31)&1);//符号位在第32位
}
public static int flip(int n) {//1->0;0->1
return n^1;//或者~n
}
public static int getMax1(int a,int b) {//只适用于符号相同,否则,可能会溢出
int c=a-b;
int sc=sign(c);
int returnA=sc;
int returnB=flip(returnA);
return returnA*a+returnB*b;
}
public static int getMax2(int a,int b) {
int c=a-b;
int sa=sign(a);//a的符号
int sb=sign(b);
int sc=sign(c);
int diffSab=sa^sb;
//a、b符号相同,diffSab为0,考察c;a、b符号不同,a为正,b为负,a>b
int sameSab=flip(diffSab);
int returnA=diffSab*sa+sameSab*sc;//满足这些条件时,returnA为1,则returnB为0,返回a
int returnB=flip(returnA);
return returnA*a+returnB*b;
}
public static void main(String[] args) {
int a=-16;
int b=1;
System.out.println(getMax1(a,b));
System.out.println(getMax2(a,b));
//1 数不够大,还未溢出
//1
a=2147483647;
b=-2147480000;
System.out.println(getMax1(a,b));
System.out.println(getMax2(a,b));
//-2147480000 数大了,溢出
//2147483647
}
}
2、判断一个32位正数是不是2的幂、4的幂
package day;
public class Demo {
public static boolean is2Power(int n) {
//法一
int mostRight=((~n)+1)&n;
return mostRight==n;
//法二
//return n&(n-1)==0;
//如果是2的幂,n-1会把n打散,&的结果为0
}
public static boolean is4Power(int n) {
return (n&(n-1))==0 && (n&0x55555555)!=0;//只有一个1且...
}
}
3、给定2个有32位有符号整数a和b,不能使用算术运算符,分别实现a和b的加减乘除。
(如果执行给定a、b操作,结果溢出,函数不必对此负责)
package day;
public class Demo {
public static int add(int a,int b) {
int sum=a;//a作a+b无进位相加
while (b!=0){//b为进位信息,当没进位信息时,a即为相加结果
sum=a^b;
b=(a&b)<<1;
a=sum;
}
return a;
}
public static int minus (int a,int b) {//a-b->a+(-b)
return add(a,-b);
}
public static int minus2 (int a,int b) {//a-b->a+(-b)
return add(a,negNum(b));
}
public static int negNum(int n) {//返回一个数的相反数
//+2->-2:原码,仅变符号位,移码:符号位不变,其余取反+1
return add((~n),1);
}
public static int multi(int a,int b) {
int res=0;
while (b!=0){
if((b&1)!=0){//当前最低位为1
res=add(res,a);
}
a<<=1;//a每次向左移动一位
b>>>=1;//不带符号右移
}
return res;
}
public static int div(int a,int b) {//只支持所有数都为正数的判断
int res=0;
for(int i=31;i>-1;i--){//最多移动31位,一共就32个数;最少移动0位
if((a>>i)>=b){
res|=(1<<i);
a=minus(a,b<<i);
}
}
return res;
}
public static void main(String[] args) {
System.out.println(add(16,17));//33
System.out.println(minus(100,6));//94
System.out.println(minus2(100,6));
System.out.println(multi(2,11));
//22
//2
}
}