• 码海拾遗:位运算实现加减乘除


      1、说明:使用位运算进行加运算是面试过程中经常遇到的;减乘除均可以基于位运算加来实现。

      减:加第二个数的取反

      乘:n个第一个数相加

      除:第一个数最多可以减去多少个被减数

      2、位运算符

      &:按位与,两个相应的二进位数为1,该位的结果为 1 否则为 0

      |:按位或,两个相应的二进位中只要有一个为 1,该位的结果就为 1

      ^(加运算):按位异或,参加运算的两个二进位同号,则结果为0,异号则为1

      ~:取反,单目运算符,对二进制数按位取反

      >>:右移操作符,将一个数各二进位全部右移若干位

      <<:左移操作符,将一个数各二进位全部左移若干位

      3、实现

      1 #include <iostream>
      2 
      3 using namespace std;
      4 
      5 int bitAdd(int num1, int num2);
      6 int Negative(int num);
      7 int bitSubtract(int num1, int num2);
      8 int bitMultiply(int num1, int num2);
      9 int neg_bitMultiply(int num1, int num2);
     10 int bitDivide(int num1, int num2);
     11 int neg_bitDivide(int num1, int num2);
     12 int isZero(int num1);
     13 int isPositive(int num);
     14 int isNegative(int num);
     15 int swap(int num1, int num2);
     16 
     17 int main(int argc, char* argv[])
     18 {
     19     cout << "bitAdd(5,6) = " << bitAdd(5, 6) << endl;
     20     cout << "bitSubtract(5,6) = " << bitSubtract(5, 6) << endl;
     21     cout << "bitMultiply(5,6) = " << bitMultiply(5, 6) << endl;
     22     cout << "bitDivide(5,6) = " << bitDivide(5, 6) << endl;
     23     cout << "isZero(0) = " << isZero(0) << endl;
     24     cout << "neg_bitMultiply(3,-5) = " << neg_bitMultiply(3, -5) << endl;
     25     cout << "neg_bitDivide(-15,3) = " << neg_bitDivide(-15, 3) << endl;
     26 
     27     getchar();
     28     return 0;
     29 }
     30 
     31 //正数加
     32 int bitAdd(int num1, int num2)
     33 {
     34     int result = 0;
     35 
     36     while (num2)
     37     {
     38         result = num1^num2;
     39         num2 = (num1&num2) << 1;
     40         num1 = result;
     41     }
     42 
     43     return result;
     44 }
     45 
     46 //取反
     47 int Negative(int num)
     48 {
     49     return bitAdd(~num, 1);
     50 }
     51 
     52 //正数减
     53 int bitSubtract(int num1, int num2)
     54 {
     55     return bitAdd(num1,Negative(num2));
     56 }
     57 
     58 //正数乘
     59 int bitMultiply(int num1, int num2)
     60 {
     61     int result = 0;
     62 
     63     while (num2)
     64     {
     65         if (num2 & 1)
     66             result = bitAdd(result, num1);
     67         num1 = num1 << 1;
     68         num2 = num2 >> 1;
     69     }
     70     return result;
     71 }
     72 
     73 //考虑负数的乘
     74 int neg_bitMultiply(int num1, int num2)
     75 {
     76     if (isZero((num1)) || isZero(num2))
     77         return 0;
     78     if (isNegative(num1))
     79     {
     80         if (isNegative(num2))
     81             return bitMultiply(Negative(num1), Negative(num2));
     82         else
     83             return Negative(bitMultiply(Negative(num1), num2));
     84     }
     85     else if (isNegative(num2))
     86             return Negative(bitMultiply(num1, Negative(num2)));
     87     else
     88         return bitMultiply(num1, num2);
     89 }
     90 
     91 //正数除
     92 int bitDivide(int num1, int num2)
     93 {
     94     int coun = 0;
     95     while (num1 >= num2)
     96     {
     97         num1 = bitSubtract(num1, num2);
     98         coun = bitAdd(coun, 1);
     99     }
    100     return coun;
    101 }
    102 
    103 //考虑负数的除
    104 int neg_bitDivide(int num1, int num2)
    105 {
    106     if (isZero(num2))
    107     {
    108         cout << "num2 is 0" << endl;
    109         exit(-1);
    110     }
    111     if (isZero(num1))
    112         return 0;
    113 
    114     if (isNegative(num1))
    115     {
    116         if (isNegative(num2))
    117             return bitDivide(Negative(num1), Negative(num2));
    118         else
    119             return Negative(bitDivide(Negative(num1), num2));
    120     }
    121     else if (isNegative(num2))
    122         return Negative(bitDivide(num1, Negative(num2)));
    123     else
    124         return bitDivide(num1, num2);
    125 }
    126 
    127 //0值判断
    128 int isZero(int num)
    129 {
    130     return !(num&0xFFFF);
    131 }
    132 
    133 //正数判断
    134 int isPositive(int num)
    135 {
    136     return (num & 0xFFFF) && !(num & 0x8000);
    137 }
    138 
    139 //负数判断
    140 int isNegative(int num)
    141 {
    142     return (num & 0x8000);
    143 }
    144 
    145 //不适用临时变量交换数值
    146 int swap(int num1, int num2)
    147 {
    148     num1 = num1^num2;
    149     num2 = num2^num1;
    150     num1 = num1^num2;
    151     return 0;
    152 }
  • 相关阅读:
    animation循环滚动
    <canvas>简单学习
    月末总结
    回顾-总结(2)
    初识正则
    学习中小项目遇到事
    在炎热的夏天学习以提高效率
    前端存储之cookie、localStorage
    总结(1)
    jQuery
  • 原文地址:https://www.cnblogs.com/lianshuiwuyi/p/7637702.html
Copyright © 2020-2023  润新知