C言語で指定された2進数の2の補数を求める方法
補数とは
2進数の演算では、「1の補数」と「2の補数」という2種類の補数がよく利用されます。1の補数は、各ビットを反転させた値(0を1に、1を0に変換)です。2の補数は、1の補数に1を加算した値であり、コンピュータ内部で負の整数を表現するために広く採用されている方式です。
以下に具体例を示します。
入力例
Enter a binary number:10010001
出力例
1's complement of 10010001 is 01101110
2's complement of 10010001 is 01101111
アルゴリズム
与えられた2進数の2の補数を求めるためのアルゴリズムは以下の通りです。
ステップ1: 開始する。
ステップ2: 実行時に2進数を読み込む。
ステップ3: 入力された2進数を文字列 strdp にコピーする。
ステップ4: len = strlen(str) として文字数を取得する。
ステップ5: i = 0 から len-1 まで繰り返す(1の補数の計算)。
- ステップ5.1: str[i] == '1' ならば、str[i] = '0' とする。
- ステップ5.2: そうでなければ、str[i] = '1' とする。
- ステップ5.3: i = i + 1 として次のビットへ進む。
ステップ6: 桁上がり用フラグ mask = 1 で初期化する。
ステップ7: i = len-1 から 0 まで逆順に繰り返す(2の補数の計算)。
- ステップ7.1: mask == 1 の場合、
- str[i] == '1' ならば、str[i] = '0' とし、mask = 1 を維持する(桁上がりが継続)。
- そうでなければ、str[i] = '1' とし、mask = 0 とする(桁上がり終了)。
ステップ8: 2の補数を出力する。
ステップ9: 終了する。
C言語プログラム
以下は、与えられた2進数の2の補数を求めるC言語プログラムです。
#include <string.h>
#include<stdio.h>
main(){
char str[32],strdp[32];
int mask,i;
printf("Enter a binary number:");
scanf("%s",str);
strcpy(strdp,str);
for(i=0;i<strlen(str);i++) /* 1の補数を計算 */{
if(str[i]=='1')
str[i]='0';
else
str[i]='1';
}
printf("1\'s complement of %s is %s\n",strdp,str);
mask=1;
for(i=strlen(str)-1;i>=0;i--){
if(mask==1){
if(str[i]=='1'){
str[i]='0';
mask=1;
}
else{
str[i]='1';
mask=0;
}
}
}
printf("2\'s complement of %s is %s",strdp,str);
}
実行結果
上記のプログラムを実行すると、以下のような結果が出力されます。
Enter a binary number:11001110
1's complement of 11001110 is 00110001
2's complement of 11001110 is 00110010
まとめ
このプログラムでは、まず全ビットを反転することで1の補数を求め、その結果に対して最下位ビットから順に1を加算していくことで2の補数を計算しています。変数 mask は桁上がり(キャリー)を管理しており、「1 + 1 = 10」のように桁上がりが連鎖する様子をシンプルなロジックで実現しています。2の補数は減算回路の構成や負数の表現に不可欠な概念なので、ぜひ仕組みを理解しておきましょう。
-
C言語の反復処理(whileループ)で数値を逆順に出力する方法
問題C言語において、反復処理(whileループ)を使って、入力された数値を逆順に出力するにはどうすればよいのでしょうか?本記事では、その具体的な実装方法を解説します。解決策これまでの記事では、文字列関数を使用する場合と使用しない場合の、文字列を反転する方法を見てきました。今回は、あらかじめ用意されたライブラリ関数に頼らず、数値を反転して出力する方法を紹介します。アルゴリズム入力 − プログラムの実行時に数値を入力します。手順1: 変数 number と reverse を宣言する 手順2: reverse を 0 で初期化する 手順3: number > 0 の間、次の処理を繰り返す
-
C言語で文字列⇔数値の相互変換を行う方法|sscanf関数とsprintf関数の使い方
はじめにC言語のプログラミングにおいて、「文字列から数値への変換」および「数値から文字列への変換」とは何を意味するのでしょうか?本記事では、標準ライブラリ関数を使った双方向の変換方法を、構文・サンプルコード・実行結果とあわせて解説します。解決策:使用する2つの関数C言語には、この変換を実現するための関数が用意されています。sscanf() ― 文字列を数値に変換するsprintf() ― 数値を文字列に変換する文字列から数値への変換(sscanf)sscanf()関数を使うことで、文字列として格納されたデータを、書式指定子に従って解析し、数値として各変数に読み込むことができます。scanf()