//位运算 增加乘除
// ^ 无进位的相加
@Test
void contextLoads(){
int a=22,b=32;
int result=a+b;
System.out.println(result);
//用位运算 就是 a^b+ ((a&b)<<1) 无进位的相加 + 与完 向左移动一位
//分析: a=22 2进制 16+4+2 010110
// b 32 2进制 32 =2的5次方 100000
// a^b 异或(相通为0 不同为1) 110110 然后 a&b 向左移1位(进位)(&都为1 才等于1) 000000
//所以最终的结果是 110110=2的5次方+2的4次方+2的2次方+2的1次方=32+16+4+2=54
result=a^b+((a&b)<<1);
System.out.println(result);
//换一个进位的数字
a=28;b=37;
//分析: a=28 2进制 16+8+4 011100
//b=37 2进制 32+4+1 100101
//按照公式 a^b 相同为0 不同为1 111001 =32+16+8+1=57
// (a&b)<<1 (都是1为1 其他为0) 000100 向左移动一位 后面补0 001000=8
//然后相加 57+8=65
result=a^b ;
int carry=((a&b)<<1);
System.out.println(result +"+"+ carry);
//考虑到 ^ 以后 还会在有进位 还得考虑循环
//a+b
result=add(a,b);
System.out.println(result +"======"+a+"+"+b+"===");
//a-b 不能出现相反数 那就是 a+ ~b+1
result=add(a,add(~b,1));
System.out.println(result +"======"+a+"-"+b+"===");
//乘法的逻辑
//假设a 101110
//假设b 110101
//下面 最右边开始 如果是1 上面抄下来 后面补当前位置-1个0(如果是1 就补0个 是2就补1个) 如果是0 就不管
//= 101110+000000+10111000+000000+1011100000+10111000000
result=multi(a,-b);
System.out.println(result +"======"+a+"*"+-b+"===");
//除法
// a. 000 1 0 0 1 =9
// b. 000 0 1 1 0 = 6
//思路 a向右移30位 大于 b
//a向右移动 4 的时候 是大于b的 -b左移一位的结果
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MAX_VALUE*-1);
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MIN_VALUE*-1);
System.out.println(Integer.MIN_VALUE/-1);
/*最小值转绝对值
Integer.MIN_VALUE 取 最小值 的绝对值是 没有的
假设范围 :-20~19 除以5
( -20+1)/5= -3
5*-3=-15 -20-(-15)=-5
-5/5=-1 -3+(-1)=4*/
}
/* 0 1 1 0 = 6
1 0 0 1 =9
-----------
0110 +00000+000000+0110000
0110
0110000 =0110110=32+16+4+2=54*/
public static int multi(int a, int b) {
int res = 0;
while (b != 0) {
if ((b & 1) != 0) {// & 00001 有值
res = add(res, a);
}
a <<= 1;
b >>>= 1;//不带符号 向右移动 左边 是符号位补 如果是负数 就11了 应该不带符号01
}
return res;
}
public static int add(int a, int b) {
int sum = a;//28 57
while (b != 0) {//37 8
sum = a ^ b;//57 49
b = (a & b) << 1;//8 进位 只要进位还有 就要再次循环
a = sum;//57
}
return sum;
}
public static int negNum(int n) {
return add(~n, 1);
}
public static int minus(int a, int b) {
return add(a, negNum(b));
}
/* 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;
}*/
public static boolean isNeg(int n) {
return n < 0;
}
public static int div(int a, int b) {
int x = isNeg(a) ? negNum(a) : a;
int y = isNeg(b) ? negNum(b) : b;
int res = 0;
for (int i = 30; i >= 0; i = minus(i, 1)) {
if ((x >> i) >= y) {
res |= (1 << i);
x = minus(x, y << i);
}
}
return isNeg(a) ^ isNeg(b) ? negNum(res) : res;
}
public static int divide(int a, int b) {
if (a == Integer.MIN_VALUE && b == Integer.MIN_VALUE) {
return 1;
} else if (b == Integer.MIN_VALUE) {
return 0;
} else if (a == Integer.MIN_VALUE) {
if (b == negNum(1)) {
return Integer.MAX_VALUE;
} else {
int c = div(add(a, 1), b);
return add(c, div(minus(a, multi(c, b)), b));
}
} else {
return div(a, b);
}
}版权声明:本文为nieyaping原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。