面试题:仅使用位运算将数字扩大k倍

前提

  • 不知道有什么巧妙解法,这里说一个通解,那就是用位运算实现加减乘除。

为什么要用位运算实现加减乘除?

  • 了解计算机通过半导体实现加减乘除的逻辑
  • 不装了,其实根本就是面试可能会问
  • 加法这里可能会啰嗦一些,后面基于加法就没有这么痛苦了

加法

  • 加法,其实是由两种状态组成的:
    • 第一是各个数位都没有进位,这种最简单,就是将对应位置的数值直接相加即可
    • 第二是则是数位中有进位,这种也不难,首先是将对应位置数值加起来之后,要模上进制数,然后考虑进位数怎么计算,回忆下加法的过程,进位数其实就是当前数字除以进制数的下整数,然后再将其加到前面一个数位中,迭代执行,直到没有进位。
  • 这就引发了一个问题,既然进位数需要通过除法得到,但是除法又不允许使用,这是否陷入了困境?
    • 幸运的是,二进制数的进位其实更简单,因为进位数非0即1,因此,我们只需要知道如何得到正确的进位数即可。
    • 我们发现,二进制中,如果有相加数的对应位不都是1,那么就没有进位,此时进位是0,如果有进位,那么对应位置往前进1位,用二进制实现该逻辑就是(a&b)<<1
    • 进位问题解决了,那么其他部分呢,其他部分就如刚刚所说,数位数字模上进制数即可,对于二进制的模2加法,就是异或,也就是a^b
int add(int a,int b) {
   
  int carry,add;
  do{
   
    add = a^b;
    carry = (a&b)<<1;
    a = add;
    b=carry;
  
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值