位运算相关题

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
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值