//位运算 增加乘除 // ^ 无进位的相加 @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); } }
位运算---加、减、乘、除
最新推荐文章于 2023-11-14 19:04:31 发布