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

  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 }

 

posted @ 2017-10-08 16:19  落雷  阅读(269)  评论(0编辑  收藏  举报