Рубрики

1 и 2 дополнения двоичного числа

Задав двоичное число в виде строки, выведите его 1 и 2 дополнения.

Дополнением 1 двоичного числа является другое двоичное число, полученное переключением всех битов в нем, то есть преобразование 0 битов в 1 и 1 битов в 0.

Примеры:

1's complement of "0111" is "1000"
1's complement of "1100" is  "0011" 

Дополнение 2 двоичного числа равно 1, добавленное к дополнению 1 двоичного числа.
Примеры:

2's complement of "0111" is  "1001"
2's complement of "1100" is  "0100" 

Для дополнения нам просто нужно перевернуть все биты.

Для дополнения 2 мы сначала находим дополнение. Мы пересекаем дополнение, начиная с LSB (младший значащий бит), и ищем 0. Мы переворачиваем все 1 (меняем на 0) до тех пор, пока не найдем 0. Наконец, мы перевернем найденное 0. Например, дополнение 2 к «01000» »- это« 11000 »(обратите внимание, что сначала мы находим дополнение 01000 как 10111). Если есть все 1 (в одном дополнении), мы добавляем дополнительный 1 в строку. Например, дополнение 2 к «000» — это «1000» (дополнение «1» к «000» — это «111»).

Ниже приведена реализация.

C ++

// C ++ программа для печати 1 и 2 дополнений
// двоичное число
#include <bits/stdc++.h>

using namespace std;

  
// Возвращает «0» для «1» и «1» для «0»

char flip(char c) {return (c == '0')? '1': '0';}

  
// Распечатать 1 и 2 дополнения двоичного числа
// представлен "bin"

void printOneAndTwosComplement(string bin)

{

    int n = bin.length();

    int i;

  

    string ones, twos;

    ones = twos = "";

  

    // для тех, кто дополняет каждый бит

    for (i = 0; i < n; i++)

        ones += flip(bin[i]);

  

    // для дополнения двоих идти справа налево в

    // они дополняют друг друга, и если мы получаем 1 make, мы делаем

    // их 0 и продолжаем идти налево, когда мы получим первый

    // 0, сделать это 1 и выйти из цикла

    twos = ones;

    for (i = n - 1; i >= 0; i--)

    {

        if (ones[i] == '1')

            twos[i] = '0';

        else

        {

            twos[i] = '1';

            break;

        }

    }

  

    // Если без перерыва: все 1, как в 111 или 11111;

    // в таком случае добавляем лишнюю 1 в начале

    if (i == -1)

        twos = '1' + twos;

  

  

    cout << "1's complement: " << ones << endl;

    cout << "2's complement: " << twos << endl;

}

  
// Драйвер программы

int main()

{

    string bin = "1100";

    printOneAndTwosComplement(bin);

    return 0;

}

Джава

// Java-программа для печати 1 и 2 дополнений
// двоичное число

  

class GFG 

{

  

    // Возвращает «0» для «1» и «1» для «0»

    static char flip(char c)

    {

        return (c == '0') ? '1' : '0';

    }

  

    // Распечатать 1 и 2 дополнения двоичного числа

    // представлен "bin"

    static void printOneAndTwosComplement(String bin)

    {

        int n = bin.length();

        int i;

  

        String ones = "", twos = "";

        ones = twos = "";

  

        // для тех, кто дополняет каждый бит

        for (i = 0; i < n; i++)

        {

            ones += flip(bin.charAt(i));

        }

  

        // для дополнения двоих идти справа налево в

        // они дополняют друг друга, и если мы получаем 1 make, мы делаем

        // их 0 и продолжаем идти налево, когда мы получим первый

        // 0, сделать это 1 и выйти из цикла

        twos = ones;

        for (i = n - 1; i >= 0; i--)

        {

            if (ones.charAt(i) == '1')

            {

                twos = twos.substring(0, i) + '0' + twos.substring(i + 1);

            

            else

            {

                twos = twos.substring(0, i) + '1' + twos.substring(i + 1);

                break;

            }

        }

  

        // Если без перерыва: все 1, как в 111 или 11111;

        // в таком случае добавляем лишнюю 1 в начале

        if (i == -1)

        {

            twos = '1' + twos;

        }

  

        System.out.println("1's complement: " + ones);;

        System.out.println("2's complement: " + twos);

    }

  

    // Код драйвера

    public static void main(String[] args)

    {

        String bin = "1100";

        printOneAndTwosComplement(bin);

    }

}

  
// Этот код предоставлен Rajput-Ji

python3

# Python3 программа для печати 1 и 2
# дополнение двоичного числа

  
# Возвращает «0» для «1» и «1» для «0»

def flip(c):

    return '1' if (c == '0') else '0'

  
# Печать 1 и 2 дополнения
# двоичное число, представленное "bin"

def printOneAndTwosComplement(bin):

  

    n = len(bin

    ones = ""

    twos = ""

      

    # для тех, кто дополняет флип каждый бит

    for i in range(n):

        ones += flip(bin[i]) 

  

    # за два дополнения идти справа

    # слева в дополнение и если

    # мы получаем 1 марку, мы делаем их 0 и

    # продолжайте идти налево, когда мы доберемся до

    # 0, сделайте это 1 и выйдите из цикла

    ones = list(ones.strip(""))

    twos = list(ones)

    for i in range(n - 1, -1, -1):

      

        if (ones[i] == '1'):

            twos[i] = '0'

        else:         

            twos[i] = '1'

            break

          

    # Если без перерыва: все 1, как в 111 или 11111

    # в таком случае добавьте лишнюю 1 в начале

    if (i == -1):

        twos.insert(0, '1'

  

    print("1's complement: ", *ones, sep = "")

    print("2's complement: ", *twos, sep = "")

      
Код водителя

if __name__ == '__main__':

    bin = "1100"

    printOneAndTwosComplement(bin.strip(""))

      
# Этот код добавлен
# от SHUBHAMSINGH10

C #

// C # программа для печати 1 и 2 дополнений
// двоичное число

using System;

  

class GFG 

{

  

    // Возвращает «0» для «1» и «1» для «0»

    static char flip(char c)

    {

        return (c == '0') ? '1' : '0';

    }

  

    // Распечатать 1 и 2 дополнения двоичного числа

    // представлен "bin"

    static void printOneAndTwosComplement(String bin)

    {

        int n = bin.Length;

        int i;

  

        String ones = "", twos = "";

        ones = twos = "";

  

        // для тех, кто дополняет каждый бит

        for (i = 0; i < n; i++)

        {

            ones += flip(bin[i]);

        }

  

        // для дополнения двоих идти справа налево в

        // они дополняют друг друга, и если мы получаем 1 make, мы делаем

        // их 0 и продолжаем идти налево, когда мы получим первый

        // 0, сделать это 1 и выйти из цикла

        twos = ones;

        for (i = n - 1; i >= 0; i--)

        {

            if (ones[i] == '1')

            {

                twos = twos.Substring(0, i) + '0'

                twos.Substring(i + 1,twos.Length-(i+1));

            

            else

            {

                twos = twos.Substring(0, i) + '1'

                twos.Substring(i + 1,twos.Length-(i+1));

                break;

            }

        }

  

        // Если без перерыва: все 1, как в 111 или 11111;

        // в таком случае добавляем лишнюю 1 в начале

        if (i == -1)

        {

            twos = '1' + twos;

        }

  

        Console.WriteLine("1's complement: " + ones);;

        Console.WriteLine("2's complement: " + twos);

    }

  

    // Код драйвера

    public static void Main(String[] args)

    {

        String bin = "1100";

        printOneAndTwosComplement(bin);

    }

}

  
// Этот код предоставлен 29AjayKumar

Выход:

1's complement: 0011
2's complement: 0100

Спасибо Уткаршу Триведи за вышеуказанное решение.

Как примечание, числа со знаком обычно используют представление дополнения 2. Положительные значения сохраняются как есть, а отрицательные значения сохраняются в форме дополнения до 2. Один дополнительный бит требуется, чтобы указать, является ли число положительным или отрицательным. Например, char равен 8 битам в C. Если для char используется представление дополнения 2, то 127 сохраняется как есть, т. Е. 01111111, где первый 0 указывает положительное значение. Но -127 хранится как 10000001.


Похожие сообщения:

Эффективный метод для дополнения 2 двоичной строки

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Ссылки:
http://qa.geeksforgeeks.org/6439/write-program-calculate-ones-and-twos-complement-of-number
http://geeksquiz.com/whats-difference-between-1s-complement-and-2s-complement/

Рекомендуемые посты:

1 и 2 дополнения двоичного числа

0.00 (0%) 0 votes