普通版 剑指 Offer 浅刷浅刷(20)

<<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;(B & 1) && (ans += A);A <<= 1;B >>= 1;return ans >> 1;}};
方法一:使用&&运算作为if的替代品,递归作为for的替代品 。
方法二:这是我看一个老哥的评论看到的,秀的我头皮发麻,你定义的数组大小就相当于实现了n * (n + 1),接下来我们使用>>位的右移运算完成/ 2的效果,这就是n (n + 1) / 2了 。
方法三:快速乘,
剑指 Offer 65. 不用加减乘除做加法
class Solution {public:int add(int a, int b) {while (b) { //应进位的每位上都为0时结束int carry = a & b; // 计算 每位是否有进位,若该位有那么该位就是1a = a ^ b; // 计算 本位,即剔除要进位之后的位b = (unsigned)carry << 1; // 存储 相应位上的进位 后序的数直接加上进位就可}return a;}};//记住口诀: 异或保留,与进位, 与为空时就返回
c:判断a和b进行&运算后每一位是否有进位,若该位有进位,那么该位就为1 。
a:计算本位,即a和b进行^运算后剔除掉二进制数中相同的位置为0,方便后序与进位再做运算 。
b:其实b才是真正的进位,c只是判断是否存在进位,知道哪一位存在进位之后将其进行