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 }