左神_基础提升班_06_大数据以及位运算

这篇博客探讨了如何使用位操作进行高效的整数比较和加减乘除操作。给出了实现最大值选择的两个函数`getMax1`和`getMax2`,以及判断一个数是否为2的幂和4的幂的函数。位操作在解决这些问题时展现了其独特的优势,尤其是在处理整数计算和优化算法性能时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值