Resta de dos números usando el complemento a 2

Dados dos números a y b . La tarea es restar b de a usando el método Complemento a 2 .
Nota : Números negativos representados como complemento a 2 de números positivos.
Por ejemplo, -5 se puede representar en forma binaria como Complemento a 2 de 5. Mira la imagen a continuación: 

Ejemplos

Input : a = 2, b = 3
Output : -1

Input : a = 9, b = 7
Output : 2 

Para restar b de a . Escriba la expresión (ab) como:  

(a - b) = a + (-b)

Ahora (-b) se puede escribir como (complemento a 2 de b). Entonces, la expresión anterior ahora se puede escribir como:  

(a - b) = a + (2's complement of b)

Entonces, el problema ahora se reduce a «Sumar a al complemento a 2 de b «. La siguiente imagen ilustra el método de resta anterior para el primer ejemplo donde a = 2 y b = 3. 

A continuación se muestra la implementación del método anterior: 

C++

#include <bits/stdc++.h>
using namespace std;
 
// function to subtract two values
// using 2's complement method
int Subtract(int a, int b)
{
    int c;
 
    // ~b is the 1's Complement of b
    // adding 1 to it make it 2's Complement
    c = a + (~b + 1);
 
    return c;
}
 
// Driver code
int main()
{
    int a = 2, b = 3;
 
    cout << Subtract(a, b)<<endl;
 
    a = 9; b = 7;
    cout << Subtract(a, b);
 
    return 0;
}

Java

class GFG
{
 
// function to subtract two values
// using 2's complement method
static int Subtract(int a, int b)
{
    int c;
 
    // ~b is the 1's Complement
    // of b adding 1 to it make
    // it 2's Complement
    c = a + (~b + 1);
 
    return c;
}
 
// Driver code
public static void main(String[] args)
{
    int a = 2, b = 3;
     
    System.out.println(Subtract(a, b));
     
    a = 9; b = 7;
    System.out.println(Subtract(a, b));
}
}
 
// This code is contributed
// by ChitraNayal

Python3

# python3 program of subtraction of
# two numbers using 2's complement .
 
# function to subtract two values
# using 2's complement method
def Subtract(a,b):
     
    # ~b is the 1's Complement of b
    # adding 1 to it make it 2's Complement
    c = a + (~b + 1)
    return c
 
# Driver code
if __name__ == "__main__" :
 
    # multiple assignments
    a,b = 2,3
    print(Subtract(a,b))
 
    a,b = 9,7
    print(Subtract(a,b))

C#

// C# program of subtraction of
// two numbers using 2's complement
using System;
 
class GFG
{
// function to subtract two values
// using 2's complement method
static int Subtract(int a, int b)
{
    int c;
 
    // ~b is the 1's Complement
    // of b adding 1 to it make
    // it 2's Complement
    c = a + (~b + 1);
 
    return c;
}
 
// Driver code
static void Main()
{
    int a = 2, b = 3;
     
    Console.WriteLine(Subtract(a, b));
     
    a = 9; b = 7;
    Console.WriteLine(Subtract(a, b));
}
}
 
// This code is contributed
// by mits

PHP

<?php
// function to subtract two values
// using 2's complement method
function Subtract($a, $b)
{
 
    // ~b is the 1's Complement
    // of b adding 1 to it make
    // it 2's Complement
    $c = $a + (~$b + 1);
 
    return $c;
}
 
// Driver code
$a = 2;
$b = 3;
 
echo Subtract($a, $b) . "\n";
 
$a = 9;
$b = 7;
echo Subtract($a, $b) . "\n";
 
// This code is contributed
// by ChitraNayal
?>

Javascript

<script>
 
// Function to subtract two values
// using 2's complement method
function Subtract(a, b)
{
    var c;
 
    // ~b is the 1's Complement of b
    // adding 1 to it make it 2's Complement
    c = a + (~b + 1);
 
    return c;
}
 
// Driver code
var a = 2, b = 3;
document.write( Subtract(a, b) + "<br>");
 
a = 9; b = 7;
document.write( Subtract(a, b));
 
// This code is contributed by itsok
 
</script>
Producción

-1
2

Complejidad del tiempo – O(nlog2(n))
Espacio auxiliar – O(1)

Método 2: enfoque básico o enfoque de fuerza bruta

Resta de dos números binarios, resta dos números binarios usando el método de complemento a 2. 

Paso 1: Encuentra el complemento a 2 del sustraendo. 

Paso 2: Sume el primer número y el complemento a 2 del sustraendo. 

Paso 3: si se produce el acarreo, deséchelo. Si no hay acarreo, tome el complemento a 2 del resultado. 

A continuación se muestra la implementación del enfoque anterior.

C++

//C++ code for above approach
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
 
// Program to subtract
void Subtract(int n, int a[],
                       int b[])
{
     
    // 1's Complement
    for(int i = 0; i < n; i++)  
    {
         
        //Replace 1 by 0
        if(b[i] == 1)
        {
            b[i] = 0;
        }
       
        //Replace 0 by 1
        else
        {
            b[i] = 1;
        }
    }
   
    //Add 1 at end to get 2's Complement
    for(int i = n - 1; i >= 0; i--)
    {                      
        if(b[i] == 0)
        {
            b[i] = 1;
            break;
        }
        else
        {
            b[i] = 0;
        }
    }
   
    // Represents carry 
    int t = 0;                           
    for(int i = n - 1; i >= 0; i--)
    {
         
        // Add a, b and carry
        a[i] = a[i] + b[i] + t; 
       
        // If a[i] is 2
        if(a[i] == 2)
        {
            a[i] = 0;
            t = 1;
 
        }
       
        // If a[i] is 3
        else if(a[i] == 3)
        {
            a[i] = 1;
            t = 1;
        }
        else
            t = 0;
    }
   
    cout << endl;
     
    // If carry is generated
    // discard the carry
    if(t==1)
    {       
       
       // print the result
       for(int i = 0; i < n; i++)
       {
            
         // Print the result
         cout<<a[i];      
       }
    }
   
    // if carry is not generated
    else                
    {                 
         
        // Calculate 2's Complement
        // of the obtained result
        for(int i = 0; i < n; i++)
        {                 
            if(a[i] == 1)
                a[i] = 0;
            else
                a[i] = 1;
        }
        for(int i = n - 1; i >= 0; i--)
        {
            if(a[i] == 0)
            {
                a[i] = 1;
                break;
            }
        else
            a[i] = 0;
        }
       
        // Add -ve sign to represent
        cout << "-";        
       
        // -ve result
        // Print the resultant array
        for(int i = 0; i < n; i++)
        {
            cout << a[i];   
        }
    } 
}
 
// Driver Code
int main()
{
    int n;
    n = 5;          
    int a[] = {1, 0, 1, 0, 1},
        b[] = {1, 1, 0, 1, 0};
     
    Subtract(n,a,b);
    return 0;
}

Java

// Java code for above approach
import java.io.*;
 
class GFG{
     
// Program to subtract
static void Subtract(int n, int a[], int b[])
{
     
    // 1's Complement
    for(int i = 0; i < n; i++)   
    {
         
        // Replace 1 by 0
        if (b[i] == 1) 
        {
            b[i] = 0;
        }
         
        // Replace 0 by 1
        else
        {
            b[i] = 1; 
        }
    }
     
    // Add 1 at end to get 2's Complement
    for(int i = n - 1; i >= 0; i--) 
    {                       
        if (b[i] == 0)
        {
            b[i] = 1;
            break;
        }
        else
        {
            b[i] = 0;
        }
    }
     
    // Represents carry  
    int t = 0;                            
    for(int i = n - 1; i >= 0; i--)
    {
           
        // Add a, b and carry
        a[i] = a[i] + b[i] + t;  
         
        // If a[i] is 2
        if (a[i] == 2)
        {
            a[i] = 0;
            t = 1;
        }
         
        // If a[i] is 3
        else if (a[i] == 3)
        {
            a[i] = 1;
            t = 1;
        }
        else
            t = 0;
    }
     
    System.out.println();
       
    // If carry is generated
    // discard the carry 
    if (t == 1) 
    {        
         
        // Print the result 
        for(int i = 0; i < n; i++)
        {
             
            // Print the result
            System.out.print(a[i]);       
        }
    }
     
    // If carry is not generated
    else                
    {
         
        // Calculate 2's Complement
        // of the obtained result
        for(int i = 0; i < n; i++) 
        {                  
            if (a[i] == 1)
                a[i] = 0;
            else
                a[i] = 1;
        }
        for(int i = n - 1; i >= 0; i--)
        {
            if (a[i] == 0)
            {
                a[i] = 1;
                break;
            }
        else
            a[i] = 0;
        }
         
        // Add -ve sign to represent
        System.out.print("-");         
         
        // -ve result
        // Print the resultant array
        for(int i = 0; i < n; i++)
        {
            System.out.print(a[i]);    
        }
    }  
}
   
// Driver Code
public static void main (String[] args)
{
    int n;
    n = 5;           
    int a[] = {1, 0, 1, 0, 1};
    int b[] = {1, 1, 0, 1, 0};
   
    Subtract(n, a, b);
}
}
 
// This code is contributed by avanitrachhadiya2155

Python3

# Python implementation of above approach
 
# Program to subtract
def Subtract(n, a, b):
     
    # 1's Complement
    for i in range(n):
         
        # Replace 1 by 0
        if (b[i] == 1):
            b[i] = 0
         
        # Replace 0 by 1
        else:
            b[i] = 1
     
    # Add 1 at end to get 2's Complement
    for i in range(n - 1, -1, -1):
 
        if (b[i] == 0):
            b[i] = 1
            break
        else:
            b[i] = 0
     
    # Represents carry
    t = 0           
    for i in range(n - 1, -1, -1):
             
        # Add a, b and carry
        a[i] = a[i] + b[i] + t
         
        # If a[i] is 2
        if (a[i] == 2):
            a[i] = 0
            t = 1
         
        # If a[i] is 3
        elif (a[i] == 3):
            a[i] = 1
            t = 1
        else:
            t = 0
     
    print()
         
    # If carry is generated
    # discard the carry
    if (t == 1):
         
        # Print the result
        for i in range(n):
             
            # Print the result
            print(a[i],end="")   
     
    # If carry is not generated
    else:           
         
        # Calculate 2's Complement
        # of the obtained result
        for i in range(n):           
            if (a[i] == 1):
                a[i] = 0
            else:
                a[i] = 1
        for i in range(n - 1, -1, -1):
            if (a[i] == 0):
                a[i] = 1
                break
            else:
                a[i] = 0
         
        # Add -ve sign to represent
        print("-",end="")
         
        # -ve result
        # Print the resultant array
        for i in range(n):
            print(a[i],end="")
     
# Driver Code
n = 5
a=[1, 0, 1, 0, 1]
b=[1, 1, 0, 1, 0]
Subtract(n, a, b)
 
# This code is contributed by shinjanpatra

C#

// C# code for above approach
using System;
 
class GFG{
     
// Program to subtract
static void Subtract(int n, int[] a, int[] b)
{
     
    // 1's Complement
    for(int i = 0; i < n; i++)   
    {
         
        // Replace 1 by 0
        if (b[i] == 1) 
        {
            b[i] = 0;
        }
          
        // Replace 0 by 1
        else
        {
            b[i] = 1; 
        }
    }
      
    // Add 1 at end to get 2's Complement
    for(int i = n - 1; i >= 0; i--) 
    {                       
        if (b[i] == 0)
        {
            b[i] = 1;
            break;
        }
        else
        {
            b[i] = 0;
        }
    }
      
    // Represents carry  
    int t = 0;                            
    for(int i = n - 1; i >= 0; i--)
    {
         
        // Add a, b and carry
        a[i] = a[i] + b[i] + t;  
          
        // If a[i] is 2
        if (a[i] == 2)
        {
            a[i] = 0;
            t = 1;
        }
          
        // If a[i] is 3
        else if (a[i] == 3)
        {
            a[i] = 1;
            t = 1;
        }
        else
            t = 0;
    }
      
    Console.WriteLine();
        
    // If carry is generated
    // discard the carry 
    if (t == 1) 
    {        
          
        // Print the result 
        for(int i = 0; i < n; i++)
        {
              
            // Print the result
            Console.Write(a[i]);       
        }
    }
      
    // If carry is not generated
    else               
    {
          
        // Calculate 2's Complement
        // of the obtained result
        for(int i = 0; i < n; i++) 
        {                  
            if (a[i] == 1)
                a[i] = 0;
            else
                a[i] = 1;
        }
        for(int i = n - 1; i >= 0; i--)
        {
            if (a[i] == 0)
            {
                a[i] = 1;
                break;
            }
            else
                a[i] = 0;
        }
          
        // Add -ve sign to represent
        Console.Write("-");         
          
        // -ve result
        // Print the resultant array
        for(int i = 0; i < n; i++)
        {
            Console.Write(a[i]);    
        }
    }  
}
    
// Driver Code
static public void Main()
{
    int n;
    n = 5;           
    int[] a = {1, 0, 1, 0, 1};
    int[] b = {1, 1, 0, 1, 0};
 
    Subtract(n, a, b);
}
}
 
// This code is contributed by rag2127

Javascript

<script>
// Javascript code for above approach
     
    // Program to subtract
    function Subtract(n,a,b)
    {
        // 1's Complement
    for(let i = 0; i < n; i++)  
    {
          
        // Replace 1 by 0
        if (b[i] == 1)
        {
            b[i] = 0;
        }
          
        // Replace 0 by 1
        else
        {
            b[i] = 1;
        }
    }
      
    // Add 1 at end to get 2's Complement
    for(let i = n - 1; i >= 0; i--)
    {                      
        if (b[i] == 0)
        {
            b[i] = 1;
            break;
        }
        else
        {
            b[i] = 0;
        }
    }
      
    // Represents carry 
    let t = 0;                           
    for(let i = n - 1; i >= 0; i--)
    {
            
        // Add a, b and carry
        a[i] = a[i] + b[i] + t; 
          
        // If a[i] is 2
        if (a[i] == 2)
        {
            a[i] = 0;
            t = 1;
        }
          
        // If a[i] is 3
        else if (a[i] == 3)
        {
            a[i] = 1;
            t = 1;
        }
        else
            t = 0;
    }
      
    document.write("<br>");
        
    // If carry is generated
    // discard the carry
    if (t == 1)
    {       
          
        // Print the result
        for(let i = 0; i < n; i++)
        {
              
            // Print the result
            document.write(a[i]);      
        }
    }
      
    // If carry is not generated
    else               
    {
          
        // Calculate 2's Complement
        // of the obtained result
        for(let i = 0; i < n; i++)
        {                 
            if (a[i] == 1)
                a[i] = 0;
            else
                a[i] = 1;
        }
        for(let i = n - 1; i >= 0; i--)
        {
            if (a[i] == 0)
            {
                a[i] = 1;
                break;
            }
        else
            a[i] = 0;
        }
          
        // Add -ve sign to represent
        document.write("-");        
          
        // -ve result
        // Print the resultant array
        for(let i = 0; i < n; i++)
        {
            document.write(a[i]);   
        }
    } 
    }
     
    // Driver Code
    let n = 5;  
    let a=[1, 0, 1, 0, 1];
    let b=[1, 1, 0, 1, 0];
    Subtract(n, a, b);
     
 
// This code is contributed by patel2127
</script>
Producción

-00101

Complejidad del tiempo : O(N)

Espacio Auxiliar : O(1)

Publicación traducida automáticamente

Artículo escrito por Naman_Garg y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *