1's and 2's complement of a Binary Number (original) (raw)

Last Updated : 20 Mar, 2025

Given a binary number s represented as a string.** The task is to return its **1's complement and **2's complement in form of an arrayas [onesComplement, twosComplement].

The **1's complement of a binary number is obtained by **flipping all its bits. **0 becomes 1, and **1 becomes 0. Positive numbers remain **unchanged whereas **negative numbers are represented by taking the1's complement of their **positive counterparts.

For example, in **8-bit notation:

**Examples:

**Input: s = "0111"
**Output: 1000
**Explanation: Each bit is flipped, i.e. 0 becomes 1, and 1 becomes 0.

**Input: s= "1100"
**Output: 0011
**Explanation: Each bit is flipped, i.e. 0 becomes 1, and 1 becomes 0.

The **2's complement of a binary number is obtained by finding the 1's complement (flipping all bits) and then **adding 1 to the result. In 2's complement representation, the **Most Significant Bit (MSB) represents the sign. A 0 indicates a **positive number, while a **1 indicates a **negative number. The remaining bits represent the **magnitude.

**Positive numbers are represented the same way as in **1's complement and **sign-bit representation. **Negative numbers are obtained by taking the **2's complement of their **positive counterparts.

**Examples:

**Input: s = "0111"
**Output: 1001
**Explanation: Find 1's complement -> 1000, then add 1 -> 1000 + 1 = 1001

**Input: "1100"
**Output: 0100
**Explanation: Find 1's complement -> 0011, then add 1 -> 0011 + 1 = 0100

The idea is to first compute the **1's complement by flipping each bit of the **binary string. Then, to find the **2's complement, we add **1 to the **1's complement, starting from the rightmost bit. If all bits are flipped, an extra ****'1'** is added at the beginning. This ensures correct representation in signed binary numbers.

Steps to implement the above idea:

// C++ program to find 1's and 2's // complement of a binary number #include <bits/stdc++.h> using namespace std;

// Function to find 1's complement string onesComplement(string s) {

// Traverse each bit and flip it
for (char &c : s) {
    if (c == '0') {
        c = '1';
    } else {
        c = '0';
    }
}

return s;

}

// Function to find 2's complement string twosComplement(string s) {

// Get 1's complement of the binary number
s = onesComplement(s); 
int n = s.size();

// Add 1 to the 1's complement
for (int i = n - 1; i >= 0; i--) {
    
    // If we find '0', change it 
    // to '1' and stop
    if (s[i] == '0') {
        s[i] = '1';
        break;
    } 
    
    // If we find '1', change it 
    // to '0' and continue
    else {
        s[i] = '0';
    }
}

// If all bits were flipped, we need
// to add an extra '1'
// at the beginning to maintain 
// correct two's complement
if (s[0] == '0') {
    s = '1' + s;
}

return s;

}

// Function to compute both 1's and 2's complements vector findComplement(string s) {

// Compute 1's complement
string ones = onesComplement(s);

// Compute 2's complement
string twos = twosComplement(s);

return {ones, twos};

}

// Driver code int main() {

string s = "1001";

vector<string> result = findComplement(s);

cout << result[0] << " " << result[1] << endl;

return 0;

}

Java

// Java program to find 1's and 2's // complement of a binary number

import java.util.*;

class GfG {

// Function to find 1's complement
static String onesComplement(String s) {
    
    // Traverse each bit and flip it
    StringBuilder result = new StringBuilder(s);
    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == '0') {
            result.setCharAt(i, '1');
        } else {
            result.setCharAt(i, '0');
        }
    }
    
    return result.toString();
}

// Function to find 2's complement
static String twosComplement(String s) {
    
    // Get 1's complement of the binary number
    s = onesComplement(s);
    int n = s.length();

    // Add 1 to the 1's complement
    StringBuilder result = new StringBuilder(s);
    for (int i = n - 1; i >= 0; i--) {
        
        // If we find '0', change it 
        // to '1' and stop
        if (s.charAt(i) == '0') {
            result.setCharAt(i, '1');
            break;
        } 
        
        // If we find '1', change it 
        // to '0' and continue
        else {
            result.setCharAt(i, '0');
        }
    }

    // If all bits were flipped, we need
    // to add an extra '1'
    // at the beginning to maintain 
    // correct two's complement
    if (result.charAt(0) == '0') {
        result.insert(0, '1');
    }

    return result.toString();
}

// Function to compute both 1's and 2's complements 
static String[] findComplement(String s) {
    
    // Compute 1's complement
    String ones = onesComplement(s);
    
    // Compute 2's complement
    String twos = twosComplement(s);

    return new String[]{ones, twos};
}

// Driver code
public static void main(String[] args) {
    
    String s = "1001";

    String[] result = findComplement(s);

    System.out.println(result[0] + " " + result[1]);
}

}

Python

Python program to find 1's and 2's

complement of a binary number

Function to find 1's complement

def onesComplement(s):

# Traverse each bit and flip it
result = ""
for c in s:
    if c == '0':
        result += '1'
    else:
        result += '0'

return result

Function to find 2's complement

def twosComplement(s):

# Get 1's complement of the binary number
s = onesComplement(s)
n = len(s)

# Add 1 to the 1's complement
result = list(s)
for i in range(n - 1, -1, -1):
    
    # If we find '0', change it 
    # to '1' and stop
    if s[i] == '0':
        result[i] = '1'
        break
    
    # If we find '1', change it 
    # to '0' and continue
    else:
        result[i] = '0'

# If all bits were flipped, we need
# to add an extra '1'
# at the beginning to maintain 
# correct two's complement
if result[0] == '0':
    result.insert(0, '1')

return "".join(result)

Function to compute both 1's and 2's complements

def findComplement(s):

# Compute 1's complement
ones = onesComplement(s)

# Compute 2's complement
twos = twosComplement(s)

return [ones, twos]

Driver code

if name == "main":

s = "1001"

result = findComplement(s)

print(result[0], result[1])

C#

// C# program to find 1's and 2's // complement of a binary number

using System;

class GfG {

// Function to find 1's complement
static string onesComplement(string s) {
    
    // Traverse each bit and flip it
    char[] result = s.ToCharArray();
    for (int i = 0; i < s.Length; i++) {
        if (s[i] == '0') {
            result[i] = '1';
        } else {
            result[i] = '0';
        }
    }
    
    return new string(result);
}

// Function to find 2's complement
static string twosComplement(string s) {
    
    // Get 1's complement of the binary number
    s = onesComplement(s);
    int n = s.Length;

    // Add 1 to the 1's complement
    char[] result = s.ToCharArray();
    for (int i = n - 1; i >= 0; i--) {
        
        // If we find '0', change it 
        // to '1' and stop
        if (s[i] == '0') {
            result[i] = '1';
            break;
        } 
        
        // If we find '1', change it 
        // to '0' and continue
        else {
            result[i] = '0';
        }
    }

    // If all bits were flipped, we need
    // to add an extra '1'
    // at the beginning to maintain 
    // correct two's complement
    if (result[0] == '0') {
        return "1" + new string(result);
    }

    return new string(result);
}

// Function to compute both 1's and 2's complements 
static string[] findComplement(string s) {
    
    // Compute 1's complement
    string ones = onesComplement(s);
    
    // Compute 2's complement
    string twos = twosComplement(s);

    return new string[]{ones, twos};
}

// Driver code
public static void Main() {
    
    string s = "1001";

    string[] result = findComplement(s);

    Console.WriteLine(result[0] + " " + result[1]);
}

}

JavaScript

// JavaScript program to find 1's and 2's // complement of a binary number

// Function to find 1's complement function onesComplement(s) {

// Traverse each bit and flip it
let result = "";
for (let i = 0; i < s.length; i++) {
    if (s[i] === '0') {
        result += '1';
    } else {
        result += '0';
    }
}

return result;

}

// Function to find 2's complement function twosComplement(s) {

// Get 1's complement of the binary number
s = onesComplement(s);
let n = s.length;
let result = s.split("");

// Add 1 to the 1's complement
for (let i = n - 1; i >= 0; i--) {
    
    // If we find '0', change it 
    // to '1' and stop
    if (s[i] === '0') {
        result[i] = '1';
        break;
    } 
    
    // If we find '1', change it 
    // to '0' and continue
    else {
        result[i] = '0';
    }
}

// If all bits were flipped, we need
// to add an extra '1'
// at the beginning to maintain 
// correct two's complement
if (result[0] === '0') {
    result.unshift('1');
}

return result.join("");

}

// Function to compute both 1's and 2's complements function findComplement(s) {

// Compute 1's complement
let ones = onesComplement(s);

// Compute 2's complement
let twos = twosComplement(s);

return [ones, twos];

}

// Driver code let s = "1001";

let result = findComplement(s);

console.log(result[0], result[1]);

`

**Time Complexity: O(n), as each bit is processed once.
**Space Complexity: O(1), as no extra space is used.