chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用C語言的位運算實現加法操作詳解

STM32嵌入式開發(fā) ? 來源:STM32嵌入式開發(fā) ? 作者:STM32嵌入式開發(fā) ? 2021-04-13 10:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

分享本文,希望能起到拋磚引玉的作用,加深朋友對位運算以及計算機底層的認識。

有如下十進制的加法運算:

13 + 9 = 22

我們像這樣來拆分這個運算過程:

不考慮進位,分別對各位數進行相加,結果為sum:

個位數3加上9為2;十位數1加上0為1;最終結果為12;

只考慮進位,結果為carry:

3 + 9 有進位,進位的值為10;

如果步驟2所得進位結果carry不為0,對步驟1所得sum,步驟2所得carry重復步驟1、 2、3;如果carry為0則結束,最終結果為步驟1所得sum:

這里即是對sum = 12 和carry = 10重復以上三個步驟,(a) 不考慮進位,分別對各位數進行相加:sum = 22; (b) 只考慮進位: 上一步沒有進位,所以carry = 0;(c) 步驟2carry = 0,結束,結果為sum = 22。

把上面的運算過程放在二進制中試試。

13和9的二進制分別為:

0000 11010000 1001

①不考慮進位,分別對各位數進行相加得到sum:?

0000 0100

②當考慮進位,有兩處進位,第0位和第3位,只考慮進位的結果為carry:

0001 0010

③判斷carry是否為0,為0則結束,最終計算結果為sum;如果carry不為0,則進行如下操作,并重復步驟①②③:

sum+=carry

上面步驟③中判斷carry不為0,回到步驟①:

不考慮進位,sum+carry= :

0001 0110

步驟②:

只考慮進位,carry =:

0

步驟③:

判斷carry為0,結束,最終sum=:

0001 0110

轉換成十進制剛好是22,十進制的算法同樣適用于二進制!

仔細觀察發(fā)現:

第①步不考慮進位的加法其實就是異或運算

第②步只考慮進位就是按位與運算之后左移一位

第③步就是重復前面兩步操作,直到第二步進位結果為0

這里為什么要循環(huán)步驟①②③,直到步驟②所得進位carry等于0呢?這是因為有的數做加法時會出現連續(xù)進位的情況。在第③步檢測carry如果為0,則表示沒有進位了,此時,此次循環(huán)第①步的sum即為最終的結果。

通過位運算實現加法

按照上面的分析,寫出通過位運算實現加法的如下代碼:

// 遞歸寫法 int add(int num1, int num2){if(num2 == 0) return num1;int sum = num1 ^ num2;int carry = (num1 & num2) 《《 1;return add(sum, carry);}

// 迭代寫法 int add(int num1, int num2){ int sum = num1 ^ num2; int carry = (num1 & num2) 《《 1; while(carry != 0){ int a = sum; int b = carry; sum = a ^ b; carry = (a & b) 《《 1; }return sum;}
編輯:lyn

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    183

    文章

    7642

    瀏覽量

    144537
  • 位運算
    +關注

    關注

    0

    文章

    17

    瀏覽量

    8640

原文標題:通過C語言的位運算實現加法操作

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    為什么單片機還在用C語言編程?

    使用加法、減法、移位運算,不要過多的使用乘法除法,因為乘法和除法運算會非常耗時間,特別是除法,會耗費很多時間,這對于運算速度本身就有限制的單片機來說,是一個非常大的負擔。 二、高級
    發(fā)表于 11-28 07:37

    請問如何用C語言列舉當前所有網口?

    何用C語言列舉當前所有網口?
    發(fā)表于 11-25 07:23

    C語言特性

    數據,實現對設備的精準控制,同時降低功耗,延長設備的使用壽命。 2、可移植性:跨平臺的通行證 C 語言具有良好的可移植性,這意味著用 C 語言
    發(fā)表于 11-24 07:01

    C語言操作

    C 語言操作符包括按與( )、按或(|)、按
    發(fā)表于 11-21 07:52

    C語言宏拼接運算符典型使用

    C語言中,##運算符(稱為[size=16.002px]標記拼接運算符)用于宏定義中將兩個標記(token)拼接成一個新的標記。它在預處理階段處理,常用于動態(tài)生成變量名、函數名或類型
    發(fā)表于 11-20 08:27

    復雜的軟件算法硬件IP核的實現

    ,該模塊對應于 C 語言加法運算符。還有連接 ALU8 以及各個端口的 wire 部件等。 從 begin 到 end 部分,包含了整個函數實現
    發(fā)表于 10-30 07:02

    第4章 C語言基礎以及流水燈的實現(4.3 4.4)

    4.3 C語言基本運算符 小學數學學過加、減、乘、除等運算符號以及四則混合運算,而這些運算符號在
    的頭像 發(fā)表于 10-29 15:30 ?173次閱讀

    定點數表示實數的方法以及定點數在硬件上的運算驗證

    ,Vivado就能將后續(xù)有符號數運算綜合成相應電路(與C語言不同,Verilog規(guī)定,無符號數與有符號數運算,會將有符號數視為無符號數)。以下述RTL代碼所示有符號Q15定點數乘法為例
    發(fā)表于 10-28 08:13

    RSA加速實現思路

    工作交給軟件實現。 3 關于硬件實現與仿真 圖1蒙哥馬利模乘電路結構 圖1所示電路可以實現1024bits模乘運算,主要特征包括: ①使用32
    發(fā)表于 10-28 07:28

    E203V2長周期乘法器核心booth算法解讀

    E203V2的數據通道中的加法運算單元可得加法器的輸入沒有進位,而進行減法器運算時,進位輸入為1,此時完美解決了-A和-2A的問題,只需將運算
    發(fā)表于 10-24 09:33

    RVB 操作指令集擴展(一)

    一、B擴展簡介 B擴展,即bit-manipulation (bitmanip) extension,主打增強操作的指令集。B擴展定義了RV32-64下的操作指令。為了更精準地在領
    發(fā)表于 10-22 08:11

    e203乘法運算結構及算法原理

    乘法運算。 考慮到E203的定位以及性能、功耗與芯片面積的平衡,E203采用了一些恰到好處的資源復用設計。 首先,乘法器每周器中的加法操作是通過復用ALU中的加法
    發(fā)表于 10-22 06:43

    e203 ALU乘法運算結構及算法原理

    乘法運算。 考慮到E203的定位以及性能、功耗與芯片面積的平衡,E203采用了一些恰到好處的資源復用設計。 首先,乘法器每周器中的加法操作是通過復用ALU中的加法
    發(fā)表于 10-22 06:12

    全套C語言培訓資料—PPT課件

    與共用體、運算、文件 全套C語言培訓資料,共427頁,13個章節(jié):C語言概述、程序的靈魂—算
    發(fā)表于 03-12 14:50

    Verilog中signed和$signed()的用法

    嗎?其實不是的,因為有符號數和無符號數據的加法強結果和乘法器結構是一樣的,signed的真正作用是決定如何對操作數擴的問題。 2、verilog中的加法和乘法
    的頭像 發(fā)表于 02-17 17:47 ?1170次閱讀
    Verilog中signed和$signed()的用法