0%

位运算相关

用位运算实现两个数字比较大小

  • 图 10
  • 图 11
  • 图 12
  • 具体操作为获得a, b和a与b的差值的符号,然后利用difSab和sameSab这两个互斥(一个为1的时候另一个必然是0)的变量实现if和else的功能
  • 利用加号左右两侧互斥的变量实现if else 的功能

    取出数字最右侧位置的1

    num & (~num + 1)

    位运算加法实现

  • 图 2
  • a和b异或,得到无进位加法结果
  • a和b与的结果左移一位,得到进位的位置,二者相加
  • 然后再把进位和无进位加法的结果求异或、与,左移一位,然后相加,重复上述步骤,直到没有进位为止

    位运算减法实现

  • 加一个数的相反数
  • 相反数等于一个数字取反再+1

    位运算乘法

  • 假如一个数字二进制第k位是1,那么就将原始数字向左移k位,从k=0开始直到最大位,累加即可
  • 图 1

    位运算除法

  • a/b
  • b尽可能左移,但是不能超过a,假设移动了k1位,得到b’
  • 那么除法的第k位一定是1
  • 计算此时a-b’
  • 然后再次将b左移,但是不超过上次a-b’的结果,移动了k2位
  • 除法结果的第k2位也是1
  • 循环往复
  • 实际操作是a右移k位,判断是否比b大,原因是b左移可能溢出熬制不安全,符号位改变等等
  • 图 3
  • 最后假如有余数的话丢弃(就是b不移位也不能减)