最近零星看到一些位操作的算法题,看题目都有类似的套路,不用常规算术运算,只用位操作和判断,实现+、-、*、/
和幂次操作。之前都是看到了就做一做,今天写这篇文章对此种类型的算法题做统一整理。
加法
不用+号做加法?首先回顾一下我们小学时候学的加法运算是怎么做的。从低位到高位,逐位做加法,得到进位,循环下一位。对这道题我们也可以用同样的方法来实现加法。怎么做呢?我们可以把两个数字都表示为二进制数,然后分别对二进制数用小学的加法运算逐位计算和与进位,从低位到高位循环,得到最终结果。对二进制数来说,当前bit位的和的计算可以表示为:0 + 0 = 0,0 + 1 = 1,1 + 0 = 1,1 + 1 = 2
,这不就是XOR操作嘛!下一位bit位的进位,只有当当前两个bit位和进位中有两个1时,下一位的进位才为1,所以可以用与操作实现:(bit1 & bit2) | (bit1 & carry) | (bit2 & carry)
。这样一来,当前bit位的值和下一位的进位计算方法我们都有了,由低位到高位逐位计算即可得到无+号的加法算法:
public static long add(long a, long b){
long sum = 0, carryin = 0, tempA = 0, tempB = 0, k = 1;
while(tempA !=