Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

2進数の1の補数と2の補数とは?計算方法をわかりやすく解説

2進数とは

2進数(バイナリ)は、基数2で表現される数値体系です。使用するのは「0」と「1」の2種類の数字のみで、2進数の各桁のことをビット(bit)と呼びます。

2進数の例:0100010111

1の補数とは

2進数の1の補数とは、元の2進数の各桁を反転させたものです。具体的には、「1」を「0」に、「0」を「1」に変換することで求められます。

101100 の1の補数 = 010011

2の補数とは

2進数の2の補数は、1の補数に1を加算することで得られます。つまり、「1の補数 + 1」が2の補数です。コンピュータの内部では、負の整数を表現する際にこの2の補数が広く利用されています。

101101 の2の補数 = 010011

サンプルコード

以下は、C++で1の補数と2の補数を求めるプログラムの例です。

#include <iostream>
#include<string.h>
using namespace std;
int main() {
    char binary[10] = "01001011";
    cout<<"Binary number is "<<binary;
    // 1の補数を求める
    int length = strlen(binary);
    for(int i=0;i<length;i++) {
        if(binary[i] == '0') {
            binary[i]= '1';
        } else
            binary[i] = '0';
    }
    cout<<"One's Complement is "<<binary<<endl;
    // 2の補数を求める(最下位ビットから見て最初の0を1に反転)
    for(int i = length-1; i>=0; i--) {
        if(binary[i] == '0') {
            binary[i] = '1';
            break;
        } else {
            binary[i] = '0';
        }
    }
    cout<<"Two's complement is "<<binary;
    return 0;
}

実行結果

Binary number is 01001011
One's complement is 10110100
Two's complement is 10110101

まとめ

1の補数は単純なビット反転で求められるのに対し、2の補数はその結果に1を加えるだけで求められます。2の補数は加減算回路を共通化できるため、多くのコンピュータシステムで負の数の標準的な表現方法として採用されています。

  1. C言語プログラム:日数を月と日に変換する方法を解説

    ユーザーが総日数を入力すると、その日数を「月数」と「翌月に残る日数(余り)」に変換するプログラムを作成します。日数を月数に変換するための計算式は以下の通りです。  月数 = 日数 ÷ 30また、翌月に残る日数を求めるためのロジックは以下の通りです。  残りの日数 = 日数 % 30(30で割った余り)アルゴリズム日数を月数と日数に変換するためのアルゴリズムは以下の通りです。ステップ1: 開始ステップ2: 月数と日数の変数を宣言するステップ3: 総日数を入力するステップ4: 月数を計算する  months = days / 30ステップ5: 残りの日数を計算する  days = days % 3

  2. C言語で文字列⇔数値の相互変換を行う方法|sscanf関数とsprintf関数の使い方

    はじめにC言語のプログラミングにおいて、「文字列から数値への変換」および「数値から文字列への変換」とは何を意味するのでしょうか?本記事では、標準ライブラリ関数を使った双方向の変換方法を、構文・サンプルコード・実行結果とあわせて解説します。解決策:使用する2つの関数C言語には、この変換を実現するための関数が用意されています。sscanf() ― 文字列を数値に変換するsprintf() ― 数値を文字列に変換する文字列から数値への変換(sscanf)sscanf()関数を使うことで、文字列として格納されたデータを、書式指定子に従って解析し、数値として各変数に読み込むことができます。scanf()