初级--05--- 取模运算转化为位运算、位运算进行加减乘除
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录取模运算 转化为 位运算公式:a%b a(b-1) 且b1kk为整数案例:num % 64 等于 num 63原理:注意:取模的数b, 要满足b为2的整数次幂即b1kk为整数,公式转化才成立位运算进行加减乘除初级--01---二进制、位运算num 6 相当于 num/641. 加法add无进位信息和进位信息和 加法的和a^b (ab)12. 减法: minus可以将减法转换成加法计算。a - b a (-b)相反数正数相反数 其反码1减法代码3. 乘法: multi4. 除法: divide位运算--01---两数相除取模运算 转化为 位运算公式:若满足b为2的整数次幂即b1kk为整数时可用一个特殊的小技巧将取模运算转化为位运算a%b a(b-1) 且b1kk为整数案例:num % 64 等于 num 63原理:注意:取模的数b, 要满足b为2的整数次幂即b1kk为整数,公式转化才成立位运算进行加减乘除初级–01—二进制、位运算num 6 相当于 num/641. 加法add由a^b可得按位相加后没有进位的和由ab可得可以产生进位的地方由(ab)1得到进位后的值。那么 按位相加后原位和进位和 就是加法的和了而 a^b (ab)1 相当于把 两边再代入上述三步进行加法计算。直到进位和为0说明没有进位了则此时原位和即所求和。无进位信息和进位信息和 加法的和a^b (ab)1publicstaticintadd(inta,intb){intsuma;while(b!0){suma^b;//无进位信息和b(ab)1;//进位信息和asum;//无进位相加信息}returnsum;}2. 减法: minus可以将减法转换成加法计算。a - b a (-b)相反数正数相反数 其反码1publicstaticintnegNum(intn){returnadd(~n,1);}减法代码publicstaticintnegNum(intn){returnadd(~n,1);}publicstaticintminus(inta,intb){returnadd(a,negNum(b));}3. 乘法: multipublicstaticintmulti(inta,intb){intres0;while(b!0){if((b1)!0){resadd(res,a);}a1;b1;}returnres;}4. 除法: divide除法的意义就在于求a可以由多少个b组成。那么由此我们可得除法的实现求a能减去多少个b做减法的次数就是除法的商。位运算–01—两数相除publicstaticbooleanisNeg(intn){returnn0;}publicstaticintdiv(inta,intb){intxisNeg(a)?negNum(a):a;intyisNeg(b)?negNum(b):b;intres0;for(inti30;i0;iminus(i,1)){if((xi)y){res|(1i);xminus(x,yi);}}returnisNeg(a)^isNeg(b)?negNum(res):res;}publicstaticintdivide(inta,intb){if(aInteger.MIN_VALUEbInteger.MIN_VALUE){return1;}elseif(bInteger.MIN_VALUE){return0;}elseif(aInteger.MIN_VALUE){if(bnegNum(1)){returnInteger.MAX_VALUE;}else{intcdiv(add(a,1),b);returnadd(c,div(minus(a,multi(c,b)),b));}}else{returndiv(a,b);}}