1. 程式人生 > >C語言通過邏輯運算(與或非)實現加法

C語言通過邏輯運算(與或非)實現加法

1.加法器:首先看看下面的內容,瞭解一下什麼是加法器

本部分摘自:http://jpkc.nwpu.edu.cn/dzjc/diangongdz/wangluokecheng/dianzijishu/chapter6/6-6.html
  加法器是計算機中最基本的運算單元電路,任何複雜的加法器電路中,最基本的單元都是半加器和全加器。
  (1)半加器
  半加器只能對一位二進位制數作算術加運算,可向高位進位,但不能輸入低位的進位值。 半加器的邏輯狀態表如表6.5.1。

表6.5.1 半加器的邏輯狀態表

A

B

S

C

0
0
1
1

0
1
0
1

0
1
1
0

0
0
0
1

 邏輯表示式為:

                 
                  
  圖6.5.1(a)為用異或門和與門構成的半加器邏輯狀態圖,圖6.5.1(b)為半加器的邏輯符號。

圖6.5.1 半加器
 (2)全加器
  表6.5.2是全加器的邏輯狀態表,AiBi為本位的加數和被加數,Ci-1表示從低位輸入的進位數,Si是本位的和數,Ci為本位輸出到高位的進位數。
表6.5.2 全加器的邏輯狀態表

0
0
0
0
1
1
1
1

0
0
1
1
0
0
1
1

0
1
0
1
0
1
0
1

0
1
1
0
1
0
0
1

0
0
0
1
0
1
1
1

 邏輯表示式為:

      
        
        
        
      
 為了利用輸出Si,將Ci作適當變換
      
        
  令,則的半加和,而Si又是的半加和,因此可以把一個全加器用兩個半加器和一個或門實現,如圖6.5.3(a),圖6.5.3(b)是全加器的邏輯符號。

圖6.5.3 全加器

2.程式碼

利用上面的公式,可以得到以下程式碼(可加可減,可正可負,因為負數就是補碼,用負數就是減法了)。至於效率,其實都是你懂的,就是看著好玩……

int func(int x, int y)
{
        int a, b , c, s;
        int tmp, flag;
        s = c = tmp = 0;
        flag = 1;
        for(int i = 0; i < 32 ; i++)
        {
                a = x & flag;
                b = y & flag;
                s = a ^ b ^ c;
                c = (a & b)<< 1;
                tmp |= s;
                flag <<= 1;
        }
        return tmp;
}
其實上面的程式碼還是用到了加法,i++,不過這裡保留著的目的是為了做看著舒服一點,而且如果是用來做較大數字加法也容易修改。強迫症犯了可以改成這樣
int func(int x, int y)
{
        int a, b , c, s;
        int tmp, flag;
        s = c = tmp = 0;
        flag = 1;
        while(1){
                a = x & flag;
                b = y & flag;
                s = a ^ b ^ c;
                c = (a & b)<< 1;
                tmp |= s;
                if(flag & 0x80000000 == 0x80000000)
                            break;
                 flag <<= 1;
        }
        return tmp;
}

相關推薦

C語言通過邏輯運算實現加法

1.加法器:首先看看下面的內容,瞭解一下什麼是加法器 本部分摘自:http://jpkc.nwpu.edu.cn/dzjc/diangongdz/wangluokecheng/dianzijishu/

C語言指標的運算指標加減一個整數的意義

        指標可以加上或減去一個整數。指標的這種運算的意義和通常的數值的加減運算的意義是不一樣的,以單元為單位。例一:#include<stdio.h> int main() { char a[]="0123456789"; int *ptr = (i

1014 C語言程序設計教程第三版課後習題6.4

content += 教程 print ons ont c語言程序設計 lld cnblogs 題目描述 求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一個數字。 輸入 n 輸出 和 樣例輸入 5 樣例輸出 153 1 #include "stdio.h"

1013: C語言程序設計教程第三版課後習題6.3

其中a是一個數字 blog += color turn sam c語言程序 [] c語言 題目描述 求Sn=a+aa+aaa+…+aa…aaa(有n個a)之值,其中a是一個數字。 例如:2+22+222+2222+22222(n=5),n由鍵盤輸入。 輸入 a 輸出 和 樣

1024: C語言程序設計教程第三版課後習題7.3

c語言程序 print clas 程序 scanf col class pri printf 題目描述 求一個3×3矩陣對角線元素之和。 輸入 矩陣 輸出 主對角線 副對角線 元素和 樣例輸入 1 2 3 1 1 1 3 2 1 樣例輸出 3 7 1 #include

1046: C語言程序設計教程第三版課後習題10.4

con n) 順序 調整 style char ++ 輸入數據 include 題目描述 有n個整數,使前面各數順序向後移m個位置,最後m個數變成前面m個數,見圖。寫一函數:實現以上功能,在主函數中輸入n個數和輸出調整後的n個數。 輸入 輸入數據的個數n n個整數 移動的位

C語言的那些事兒 迴圈結構程式設計

1.迴圈語句初認識:在不少實際問題中有許多具有規律性的重複操作,因此在程式中就需要重複執行某些語句。一組被重複執行的語句稱之為迴圈體,能否繼續重複,決定迴圈的終止條件。迴圈結構是在一定條件下反覆執行某段程式的流程結構,被反覆執行的程式被稱為迴圈體。迴圈語句是由迴圈體及迴圈的終止條件兩部

C語言操作mysql範例增刪查改

    C程式碼的API是隨MySQL一起釋出的. 它包含在mysqlclient庫中, 可以使C程式來訪問資料庫.     MySQL原始碼包中的許多客戶端都是用C寫的. 如果你正在找使用這些C API的例子, 可以看看客戶端的寫法.你可以在MySQL原始碼包的clie

C語言常用庫函式含詳細用法

一、數學函式 呼叫數學函式時,要求在原始檔中包下以下命令列: #include <math.h> 函式原型說明 功能 返回值 說明 int abs( int x) 求整數x的絕對值 計算結果 double fabs(double

史上最詳細c語言學生管理系統完整的原始碼

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> struct student { char sno[12]; char n

C語言學生管理系統學生期末作業

** 純C語言學生管理系統(學生期末作業) ** 分為7大功能:增、刪、查、改、預覽、儲存、匯出 程式碼都加有註釋,利於不懂的,理解 新增功能 //新增學生 void input () { int i; int j,ge; DaoChu(); printf("

DOS命令 的條件判斷:and、or 、not

DOS 命令實在是太弱,太難用了,基本的邏輯判斷寫起來都很費勁。一般的與或非如何解決呢? 1、非 這個有現成的,條件判斷前加not,例如: C:\Users\HW>if 1==1 echo Ok Ok C:\Users\HW>if not 1==1 echo

C語言和設計模式享元模式

【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    享元模式看上去有點玄乎,但是其實也沒有那麼複雜。我們還是用示例說話。比如說,大家在使用電腦的使用應該少不了使用WORD軟體。使用WORD呢, 那就少不了設定模板。

C語言實驗——圖形輸出字元常量練習

Time Limit: 1000MS Memory Limit: 65536KB Problem Description 用基本輸出語句列印以下圖形: # ## ### #### ##### ###### Input 本題目沒有輸入資料 Output 輸出圖形由6行組成,第

c#語言-------------型別轉換2裡式轉換

一、裡式轉換(在C#中一切類都直接或間接繼承與Object類) 1、子類可以賦值給父類:實質如果一個地方需要一個父類做為引數,我們可以給一個子類代替(一個方法中需要傳進一個子類的物件,子類做實參,我們可以讓父類作為形參接收子類的物件) 2、如果父類中裝的是子類的物件,那麼

C語言- 儲存類說明符storage class specifier:typedef

1) 定義一個新的結構型別 1 2 3 4 5 6 7 8 9 10 struct tagMyStruct { int iNum; long lLength;

C語言二維陣列第十天

二維陣列: 二維陣列可以看成是多個數組組成的一個數組 比如: int arr[2][3]={{1,2,3},{4,5,6}};int 和一維陣列一樣 代表的的陣列的型別 arr和一維陣列一樣 是這個陣列陣列的名字 和一維陣列不同的是 二維陣列有兩個中括號 賦值也不同 其中的

C語言和設計模式觀察者模式

【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    觀察者模式可能是我們在軟體開發中使用得比較多的一種設計模式。為什麼這麼說?大家可以聽我一一到來。我們知道,在windows的軟體中,所有的界都是由視窗構成的。對話

C語言中的整數short,int,long

整數是程式設計中常用的一種資料,C語言中有三種整數型別,分別為 short、int 和 long。int 稱為整型,short 稱為短整型,long 稱為長整型,它們的長度(所佔位元組數)關係為: short <= int <= long 它們具體佔用幾個位元

C語言 通過遞迴 、_findfirst、_findnext函式實現 搜尋指定目錄的指定檔案

主要使用:_findfirst、_findnext函式OperateFile.c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h