位运算符实现加法和乘法
生活随笔
收集整理的這篇文章主要介紹了
位运算符实现加法和乘法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 加法:
- 乘法:
- 問題1:
- 問題2:
加法:
#include <iostream> using namespace std; int main() {int x, y;cin >> x >> y;int z = x ^ y;int d = x & y;if (d) {while (d) {int end = (d << 1); d = (end & z);z = (end ^ z);}printf("%d",z);}else {printf("%d", z);}}異或本身就是不進位的加法,用異或之后然后進行是否有需要進位的判斷,如果需要進位的話,那么進行左移一位(因為進位是進前一位),進位完后,進行異或相加,加完之后需要再次判斷是否有進位(因為一次相與只判斷一次相加進位),并不能代表進位一次后不存在第二次進位,或者第三次比如:二進制1111+0001,就需要進位4次
乘法:
#include <iostream> using namespace std; int main() {int x, y,z,input,inputs;cin >> input >> inputs;x = inputs;y = inputs;for (int i = 0; i <input-1; i++) {z = x ^ y;int d = x & y;//d=4int ands;if (d) {while (d) {int end = (d << 1);d = (end & z);z = (end ^ z);}x = z; }else {x = z; }}printf("%d", x); }乘法的問題有點多的,我調了半小時,問題如下:
問題1:
z = (end ^ z);這行代碼起初我直接用個新的ands變量來接收,那樣的話,第二次異或的時候仍然異或的是z = x ^ y;這個變量,那樣的話,只異或一次是對的,異或兩次以上,直接出錯
問題2:
d = (end & z);z = (end ^ z);這兩行代碼順序不能顛倒,顛倒之后算出值為負數,因為循環指定是d值判斷,d又是靠之前的z值,而不是計算后的z值
總結
以上是生活随笔為你收集整理的位运算符实现加法和乘法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python对象注意点
- 下一篇: linux编译llvm代码