掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29098

2進数16桁減算プログラム
投稿者---s18227(2006/11/29 14:47:45)


2進数16桁の減算プログラムをmain関数として作成したいです

2進数16桁の加算プログラムは作成できました

#include "stdafx.h"
#define LENGTH 16
void fadder( int *s
,int *co
,int *x
,int *y
,int *ci
)
{
int h ;
h = (*x) ^ (*y);
*s = h ^ (*ci);
*co = (*x) & (*y) | h & (*ci);
return;
}

void main ()
{
int x[LENGTH], y[LENGTH], s[LENGTH];
int ci;
int co;
int answer[LENGTH];

int x16,y16,s16,bit = 0x01;
int i;

printf("X=");
scanf("%d",&x16);
printf("Y=");
scanf("%d",&y16);

for(i = 0 ; i < LENGTH ; i++ )
{
x[i]=y[i]=0;
if((x16 & bit) != 0)
x[i] = 1;
if((y16 & bit) != 0)
y[i] = 1;
bit<<=1;
}
ci = 0;
for(i = 0 ; i < LENGTH ; i++ )
{
fadder(&s[i],&co,&x[i],&y[i],&ci);
ci=co;
answer[i]=s[i];
}

for(i=LENGTH-1 ; i>-1 ; i--)
{
printf("%d",answer[i]);
}
bit=0x01;
s16=0;
for(i=0;i<LENGTH;i++)
{
if(s[i]!=0)s16=s16|bit;
bit<<=1;
}
}

これを減算のプログラムにしたいのですが、どうしてもわからないので教えていただけませんか?
よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:2進数16桁減算プログラム 29100 RiSK 2006/11/29 16:23:55
<子記事> Re:2進数16桁減算プログラム 29108 chu- 2006/11/29 18:43:34


No.29100

Re:2進数16桁減算プログラム
投稿者---RiSK(2006/11/29 16:23:55)


>2進数16桁の減算プログラムをmain関数として作成したいです
#include<stdio.h>
#include<stdlib.h>
void f(long n){
    if(n>1)f(n/2);
    putchar(n%2+'0');
}
int main(void){
    char x[17],y[17];
    if(scanf("%16[01] %16[01]",x,y)!=2)return 1;
    f(strtol(x,0,2)-strtol(y,0,2));
    puts("");
}



この投稿にコメントする

削除パスワード

No.29108

Re:2進数16桁減算プログラム
投稿者---chu-(2006/11/29 18:43:34)


加算器や減算器を模擬してみたいのでしょうか。

いい勉強になると思い、AとBの2種類の方法を考えて組んでみました。
参考までに。

[ソース]
#include <stdio.h>

typedef char bit;

bit add(bit inout[], const bit in[], int n)
{
    bit carry = 0;
    bit work;
    int i;

    for ( i = 0; i < n; i++ ) {
        work = in[i] ^ carry;
        carry = (in[i] & carry) | (inout[i] & work);
        inout[i] ^= work;
    }
    return carry;
}

bit sub(bit inout[], const bit in[], int n)
{
#if 1
    /* A:加算コードを流用して、減算を2の補数の加算とした版 */
    /* 2の補数:全ビットを反転し1を足す */
    bit carry = 1;
    bit work;
    int i;

    for ( i = 0; i < n; i++ ) {
        work = !in[i] ^ carry;
        carry = (!in[i] & carry) | (inout[i] & work);
        inout[i] ^= work;
    }
    return !carry;
#else
    /* B:減算の真理値表を書いて、そこから論理式を導き出した版 */
    bit carry = 0;
    bit work;
    int i;

    for ( i = 0; i < n; i++ ) {
        work = carry;
        carry = (inout[i] & in[i] & carry) | (~inout[i] & (in[i] | carry));
        inout[i] = inout[i] ^ in[i] ^ work;
    }
    return carry;
#endif
}

void print(const char *label, const bit data[], int n)
{
    int i;

    printf("%s", label);
    for ( i = n - 1; i >= 0; i-- )
        putchar('0' + (data[i] != 0));
    putchar('\n');
}

#define N 16

int main(void)
{
    bit a[N] = { 1,1,1,1, 1,1,1,0, 1,1,0,0, 1,0,0,0, };
    bit b[N] = { 1,0,0,0, 1,0,0,0, 1,0,0,0, 1,0,0,0, };

    print("a:", a, N);
    print("b:", b, N);

    puts("a+=b");
    add(a, b, N);
    print("a:", a, N);

    puts("a-=b");
    sub(a, b, N);
    print("a:", a, N);

    return 0;
}

[出力]
a:0001001101111111
b:0001000100010001
a+=b
a:0010010010010000
a-=b
a:0001001101111111



この投稿にコメントする

削除パスワード

No.29109

Re:2進数16桁減算プログラム
投稿者---かずま(2006/11/29 21:54:58)


>  /* B:減算の真理値表を書いて、そこから論理式を導き出した版 */

>       work = carry;
>       carry = (inout[i] & in[i] & carry) | (~inout[i] & (in[i] | carry));
>       inout[i] = inout[i] ^ in[i] ^ work;

もう少し単純化できますよ。

        work = carry ^ in[i];
        carry = (carry & in[i]) | (work & ~inout[i]);
        inout[i] ^= work;



この投稿にコメントする

削除パスワード

No.29115

Re:2進数16桁減算プログラム
投稿者---chu-(2006/12/01 10:50:30)


返信ありがとうございます。

以下のように論理式を変換できることを確認しました。

inout[i] : A
in[i]    : B
carry    : C

[私の式]
carry = (A & B & C) | (!A & (B | C));
↓
(カルノー図を書いて式を再構築)
↓
carry = (B & C) | (!A & B) | (!A & C);
↓
(ブール代数の分配則(A・(B+C)=(A・B)+(A・C))を適用)
↓
carry = (B & C) | (!A & (B | C));
↓
(左項の(B & C)を利用して右項を(B ^ C)へ変更)
↓
[かずまさんの式]
carry = (B & C) | (!A & (B ^ C));

[参考:加算の式]
carry = (B & C) | (A & (B ^ C));



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧