//位运算
public class BitOperation {
//获取符号位的异或,正数是1,负数是0
public static int unsign(int a) {
return a >> 31 & 1 ^ 1;
}
//比较两个数谁大谁小
public static int max(int a, int b) {
int c = a - b;
int sa = unsign(a);
int sb = unsign(b);
int sc = unsign(c);
//确定ab的符号是否相同? 相同的话就是0 ,不相同就是1
int isab = sa ^ sb;
//相同为1,不相同为0
int unisab = isab ^ 1;
//如果a为最大值那么returnA必须为1 因此 isab*sa+unisab*sc =1 则 isab*sa=1 或者unisab*sc =1
// 对应了a>b的两种情况 ,一种就是ab的符号是一样的,并且c为正数 那么isab =0 unisab=1 isab*sa =0 ,
// unisab*sc = 1 sc=1 这样符合逻辑,另外一种就是ab符号不一样 要符号a>b那么a必须是正数,并且差值c
// 必须是正数 所以得到了 sc =1 sa = 1 isab =1 unisab=0 因此 returnA =1 所以符合
int returnA = isab * sa + unisab * sc;
int returnB = returnA ^ 1;
//a*returnA+b*returnB 如果返回的是a 那么说明a>b 并且returnA=1
return a * returnA + b * returnB;
}
//两个数相加用位运算实现
public static int add(int a, int b) {
//a^b就是a和b无进位相加
int yihuo = a ^ b;
//(a&b)<<1就是a+b的进位
int yu = (a & b) << 1;
int cur = yihuo;
while (yu != 0) {
yihuo = yihuo ^ yu;
yu = (cur & yu) << 1;
cur = yihuo;
}
return yihuo;
}
public static int jian(int a, int b) {
return add(a, add(~b, 1));
}
//乘法的思路就是被除数如果是0就跳过如果是1 就加上除数的左移步骤位
public static int chen(int a, int b) {
int len = 0;
int sum = 0;
while (b != 0) {
if ((b & 1) == 1) {
sum = add(sum, a);
}
a <<= 1;
b >>= 1;
}
return sum;
}
public static void main(String[] args) {
// int maxnum = max(-2, -1);
// System.out.println(maxnum);
// int add = add(-1, 5);
// int jian = jian(-1, 5);
// System.out.println(add);
// System.out.println(~5);
int chen = chen(-3, 5);
System.out.println(chen);
}
}
算法基础部分-位运算
最新推荐文章于 2024-07-12 15:51:39 发布