[轉]C++二進制完成加減乘除

?

首先介紹計算機的二進制碼

二進制常用的有原碼,反碼和補碼,他們都是由最左邊的一個符號位和右邊的數值位構成。在計算機中為了更低成本的計算,數據都是用補碼來存儲和運算的。

原碼

最高位表示符號位(0代表正數,1代表負數)。剩下的位數,是這個數的絕對值的二進制。

比如 一個int變量大小為4字節,在32位的編譯器中的二進制表示就是00000000 00000000 00000000 00000000
那么10 的原碼就是00000000 00000000 00000000 00001010
?10的原碼就是 10000000 00000000 00000000 00001010

反碼

正數的反碼和其原碼是一樣的
負數的反碼就是在其原碼的基礎上 符號位不變 其他位取反。

10的反碼就是00000000 00000000 00000000 00001010 和原碼一樣
?10的反碼就是11111111 11111111 11111111 11110101

補碼

正數的補碼就是其原碼
負數的補碼就是在其反碼的基礎上+1

10的補碼就是00000000 00000000 00000000 00001010
?10的補碼就是 11111111 11111111 11111111 11111011

總結一下

計算機系統中,數值一律用補碼來表示:因為補碼可以使符號位和數值位統一處理,同時可以使減法按照加法來處理。
二進制編碼:數值編碼分為原碼,反碼,補碼,符號位均為0正1負。

原碼 -> 補碼: 數值位取反加1

補碼 -> 原碼: 對該補碼的數值位繼續 取反加1

補碼 的絕對值(稱為真值):正數的真值就是本身,負數的真值是各位(包括符號位)取反加1(即變成原碼并把符號位取反).

介紹基本的位操作

^:按位異或;&:按位與; | :按位或
b -> -b : 各位(包括符號位)取反加1

用位操作實現加法運算

我們先不考慮進位,在1位數的加法上,如下
1. 1+1=0
2. 1+0=1
3. 0+1=1
4. 0+0=0
很明顯上面幾個表達式我們可以用異或進行統一
1. 1^1=0
2. 1^0=1
3. 0^1=1
4. 0^0=0
這樣我們就完成了最基礎的一位數的加法,但是怎么計算二位以上的加法呢?我們發現現在方法的問題在于不能夠獲取進位,于是我們通過觀察一位數的加法的式子,發現只有兩個數位都是1的時候才會有進位,其他都不進位,這不是和&很像嗎? 我們通過把+換成&得到下式
1. 1&1=0 不進位
2. 1&0=1 不進位
3. 0&1=1 不進位
4. 0&0=0 進位
那么我們把所有位進行&操作,然后<<左移一位,不就可以當作加數當前的進位嗎?
到這里我們就完整解決了二進制相加問題中,對應位的相加和進位的問題
1. x^y 加法
2. (x&y)<<1 進位操作
那么總結一下:

定理1:設a,b為兩個二進制數,則a+b=a^b+(a&b)<<1。
證明:

a^b是不考慮進位時加法結果。當二進制位同時為1時,才有進位,因此 (a&b)<<1是進位產生的值,稱為進位補償。將兩者相加便是完整加法結果。

定理2:使用定理1可以實現只用位運算進行加法運算。
證明:

利用定理1中的等式不停對自身進行迭代。每迭代一次,進位補償右邊就多一位0,因此最多需要加數二進制位長度次迭代,進位補償就變為0,這時運算結束。

那么我們可以根據上面的定理得到實際的C++代碼如下

int add(int a, int b){int re = a;while(b){int tmp = a;a = a^b;b = (tmp&b)<<1;re = a;}return re;
}

用位操作實現減法

減法和加法原理相同,減去一個數相當于加上這個數的相反數,所以完全可以利用加法操作,唯一需要做的就是求出被減數的相反數。
求相反數的方法:每一位取反,末位加一。
代碼如下:

int subtraction(int a, int b)
{b = add(~b,1); // 求b的相反數return add(a, b);
}

用位操作實現乘法

二進制的乘法同十進制的乘法并無什么不一樣,對于a?b每次只需要將a左移對應的位,然后同上一次的結果相加即可
當b的對應位為1的時候,對a左移一位相加即可
當b的對應位位0的時候,對a左移一位,但是不相加
注意到我們上面的操作都是不包括符號位的,因此我們單獨考慮符號位。
代碼如下

int getSign(int n)
{unsigned count = 0;//計算n的位數do{++count;}while(n >> count)//得到n的最左邊的位return n >> (count-1);
}int mul(int a, int b){bool isNegative = false;if(getSign(a) ^ getSigned(b))isNegative = true;if(a < 0) a = add(~a,1);//求出a的絕對值if(b < 0) b = add(~b,1);//求出b的絕對值int res = 0;while(b){               //當b不為0,繼續循環if(b & 1)           //當b當前位為1 才需要加ares = add(res,a);a = a << 1;b = b >> 1;}if(isNegative)add(~res,1);return res;
}

二進制除法

同乘法一樣,除法一樣可以用減法來代替,當a≥b才可以上商,在每次上一個商(也就是商值加1)之后,a=a?b
代碼如下

int divide(int a, int b){if(!b)throw std::runtime_error("Divided can't be zero...");bool isNegative = false;bool isNegtive = false;if(getSign(a) ^ getSign(b))isNegtive = true;if(a < 0) a = add(~a,1);//求出a的絕對值if(b < 0) b = add(~b,1);//求出b的絕對值int res = 0;while(a >= b){res = add(res,1);a = subtraction(a,b);}if(isNegative)add(~res,1);return res;
}


---------------------
作者:harry_128
來源:CSDN
原文:https://blog.csdn.net/harry_128/article/details/80150502
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284940.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284940.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284940.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WGS84(GPS)、火星坐標系(GCJ02)、百度地圖(BD09)坐標系轉換案例教程(附轉換工具下載)

在做基于百度地圖、高德地圖等電子地圖做為地圖服務的二次開發時,通常需要將具有WGS84等坐標的矢量數據(如行政區劃、地名、河流、道路等GIS地理空間數據)添加到地圖上面,然而,在線地圖大多使用的是火星坐標系,需要事先將矢量數據轉為火星坐標系。本文以案例的形式,講述…

.NET 6 AssemblyLoadContext DLL 庫 熱插拔邏輯實現

曾經也實現過.Net Framework 基于AppDomain 的 dll庫熱插拔&#xff0c;經歷了版本的迭代&#xff0c;.Net Core 不支持 AppDomain&#xff0c;之前也搞過.Net Core 3.1 版本的&#xff0c;現在搞一下子.NET 6.0的。熱插拔運用的場景主要運用到宿主與插件這個場景或者動態任務的…

C語言試題193之實現strcmp函數功能

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現st…

淺談Java多線程同步機制之同步塊(方法)——synchronized

在多線程訪問的時候&#xff0c;同一時刻只能有一個線程能夠用 synchronized 修飾的方法或者代碼塊&#xff0c;解決了資源共享。下面代碼示意三個窗口購5張火車票&#xff1a; 1 package com.jikexueyuan.thread;2 /*3 * 未使用synchronized&#xff0c;存在并發4 */5 class…

[轉]Webpack5(從入門到精通)

這里寫目錄標題 1、webpack 初體驗 全局安裝webpack2.打包樣式資源 創建webpack.config.js文件&#xff08;配置文件&#xff09;3.打包html資源 webpack.config.js文件&#xff08;配置文件&#xff09;4.打包圖片資源 webpack.config.js文件&#xff08;配置文件&#xff09;…

mybatis由淺入深day01_5mybatis開發dao的方法(5.1SqlSession使用范圍_5.2原始dao開發方法)...

5 mybatis開發dao的方法 5.1 SqlSession使用范圍 5.1.1 SqlSessionFactoryBuilder 通過SqlSessionFactoryBuilder創建會話工廠SqlSessionFactory 將SqlSessionFactoryBuilder當成一個工具類使用即可&#xff0c;不需要使用單例管理SqlSessionFactoryBuilder。 在需要創建SqlSes…

做?個?德地圖的 iOS / Android MAUI 控件(上)

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;10分鐘)Microsoft Build 2022 ?會上正式發布了 .NET MAUI , 對于 .NET 開發者可以? C# 完成跨平臺的前端應?開發。對?起 MAUI 的前身 Xamarin , MAUI 除了可以?傳統的原?開發模式外&#xff0c;還?持了 Blazor…

易康eCognition Developer 9.01安裝教程(附eCognition下載地址及中文教程)

eCognition是由德國Definiens Imaging公司2009年推出的智能化影像分析軟件,2010年被美國Trimble公司收購。eCognition是目前所有商用遙感軟件中第一個基于目標信息的遙感信息提取軟件,它采用決策專家系統支持的模糊分類算法,突破了傳統商業遙感軟件單純基于光譜信息進行影像…

[改善Java代碼]不要覆寫靜態方法

建議33&#xff1a; 不要覆寫靜態方法 我們知道在Java中可以通過覆寫&#xff08;Override&#xff09;來增強或減弱父類的方法和行為&#xff0c;但覆寫是針對非靜態方法&#xff08;也叫做實例方法&#xff0c;只有生成實例才能調用的方法&#xff09;的&#xff0c;不能針對…

C語言試題194之實現strcpy函數功能

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現st…

ArcGIS實驗教程——實驗四十三:ArcGIS柵格重分類(Reclass)案例詳解

文章目錄 一、重分類1. 新值替代2. 將值組合到一起3. 按相同等級對一組柵格的值進行重分類4. 將特定值設置為NoData 或者為 NoData像元設置某個值二、查找表三、分割四、使用表重分類五、使用ASCI文件重分類重分類就是對原有柵格像元值重新分類從而得到一組新值并輸出。重分類工…

[中文版] 可視化 CSS References 文檔

本文分享了我將可視化 CSS References 文檔翻譯成中文版的介紹&#xff0c;翻譯工作還在陸續進行中&#xff0c;供學習 CSS 參考。 1. 可視化 CSS References 文檔介紹 許多 CSS 的文檔都是屬性的介紹&#xff0c;而開源項目 css-reference 并沒有提供中文版&#xff0c;而當我…

對比 C# 聊聊 C++ 中幾類特殊成員函數

一&#xff1a;背景 在 C# 中要說類默認給我們定義的特殊成員函數&#xff0c;莫過于 構造函數&#xff0c;但在 C 中這樣的特殊函數高達 6 種&#xff0c;有必要整合一下聊一聊。二&#xff1a;特殊成員函數 1. 默認構造函數和 C# 一樣&#xff0c;很多書中都說&#xff0c;如…

Js 枚舉定義Layer Icon

layer的icon有7種樣式&#xff1a;1-7 [圖片來自&#xff1a;https://blog.csdn.net/beauxie/article/details/60959971] 有時候常常記不住 &#x1f623;&#xff0c;不防自己定義一哈&#xff1a; var layerIcon {//無none: -1,//成功success: 1,//失敗error: 2,//提問、疑…

前端進階之路: 前端架構設計(2)-流程核心

可能很多人和我一樣, 首次聽到"前端架構"這個詞, 第一反應是: "前端還有架構這一說呢?" 在后端開發領域, 系統規劃和可擴展性非常關鍵, 因此架構師備受重視, 早在開發工作啟動之前, 他們就被邀請加入到項目中, 而且他們會跟客戶討論即將建成的平臺的架構要…

C語言試題195之實現strnchr函數功能

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現strnchr函數功能 函數名稱:在字符串中查找字符 函數原型:char *strnchr(cons…

8.2設備文件及磁盤分區

2019獨角獸企業重金招聘Python工程師標準>>> 概覽&#xff1a; 設備文件的創建 權限 設備名 類型 主設備號 次設備號 mknod [-m MODE] NAME type [MAJOR MINOR] 創建時&#xff0c;先查看是否存在設備號的沖突 零磁道零扇區是MBR&#xff1a;Maste…

【ArcGIS風暴】ArcGIS求一個矢量圖層中多個圖斑的“四至點”坐標案例教程

如圖所示,為ArcGIS軟件自帶的全球矢量數據,怎樣求取每個大洲(圖斑)的四至坐標(xmin、ymin、xmax、ymax)呢? 參考閱讀:【ArcGIS遇上Python】python批量獲取柵格數據四至(top,bottom,left,right)坐標代碼 文章目錄 1. 矢量數據加載2. 四至計算結果3. 四至計算過程1.…

一個關于導出excel模板的實例

1 首先jsp頁面 點擊模板下載&#xff0c;會自動下載模板&#xff45;&#xff58;&#xff43;&#xff45;&#xff4c;&#xff0c;效果如下 讓我們看源碼&#xff1a; &#xff11; &#xff4a;&#xff53;&#xff50;頁面 <div class"tab-pane" id"p…

騰訊視頻VIP會員,周卡特價9.5元!

今天給大家推薦特價充值騰訊視頻VIP會員的平臺——幻海優品&#xff0c;騰訊視頻在線直充&#xff0c;VIP會員實時生效&#xff01;騰訊視頻VIP會員特價充值周卡&#xff1a;原價12元&#xff0c;特價9.5元月卡&#xff1a;原價30元&#xff0c;特價22元季卡&#xff1a;原價68…