📜  二进制数的1和2的补码

📅  最后修改于: 2021-04-23 07:48:25             🧑  作者: Mango

给定二进制数作为字符串,打印其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" 

寻找二的补码的另一个技巧:

第1步:从最低有效位开始,向左移动,直到找到1。直到找到1,这些位保持不变

第2步:找到1后,按原样设置1

步骤3:将剩下的所有位翻转为1。

插图

假设我们需要找到100100的2s补码

第1步:遍历并让位保持不变,直到找到1。此处x尚不为人所知。答案= xxxx00 –

步骤2 :您发现1,保持不变。答案= xxx100

步骤3:将所有位翻转为1。答案= 011100。

因此,100100的2s补码为011100。

为了补全,我们只需要翻转所有位。
对于2的补码,我们首先找到一个人的补码。我们从LSB(最低有效位)开始遍历一个补数,并查找0。我们翻转所有1(更改为0),直到找到0。最后,翻转找到的0。例如,2的补数为“ 01000” ”是“ 11000”(请注意,我们首先找到01000的补码为10111)。如果全为1(在一个补码中),则在字符串添加一个额外的1。例如,“ 000”的2的补码是“ 1000”(“ 000”的1的补码是“ 111”)。

下面是实现。

C++
// C++ program to print 1's and 2's complement of
// a binary number
#include 
using namespace std;
 
// Returns '0' for '1' and '1' for '0'
char flip(char c) {return (c == '0')? '1': '0';}
 
// Print 1's and 2's complement of binary number
// represented by "bin"
void printOneAndTwosComplement(string bin)
{
    int n = bin.length();
    int i;
 
    string ones, twos;
    ones = twos = "";
 
    //  for ones complement flip every bit
    for (i = 0; i < n; i++)
        ones += flip(bin[i]);
 
    //  for two's complement go from right to left in
    //  ones complement and if we get 1 make, we make
    //  them 0 and keep going left when we get first
    //  0, make that 1 and go out of loop
    twos = ones;
    for (i = n - 1; i >= 0; i--)
    {
        if (ones[i] == '1')
            twos[i] = '0';
        else
        {
            twos[i] = '1';
            break;
        }
    }
 
    // If No break : all are 1  as in 111  or  11111;
    // in such case, add extra 1 at beginning
    if (i == -1)
        twos = '1' + twos;
 
 
    cout << "1's complement: " << ones << endl;
    cout << "2's complement: " << twos << endl;
}
 
// Driver program
int main()
{
    string bin = "1100";
    printOneAndTwosComplement(bin);
    return 0;
}


Java
// Java program to print 1's and 2's complement of
// a binary number
 
class GFG
{
 
    // Returns '0' for '1' and '1' for '0'
    static char flip(char c)
    {
        return (c == '0') ? '1' : '0';
    }
 
    // Print 1's and 2's complement of binary number
    // represented by "bin"
    static void printOneAndTwosComplement(String bin)
    {
        int n = bin.length();
        int i;
 
        String ones = "", twos = "";
        ones = twos = "";
 
        // for ones complement flip every bit
        for (i = 0; i < n; i++)
        {
            ones += flip(bin.charAt(i));
        }
 
        // for two's complement go from right to left in
        // ones complement and if we get 1 make, we make
        // them 0 and keep going left when we get first
        // 0, make that 1 and go out of loop
        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;
            }
        }
 
        // If No break : all are 1 as in 111 or 11111;
        // in such case, add extra 1 at beginning
        if (i == -1)
        {
            twos = '1' + twos;
        }
 
        System.out.println("1's complement: " + ones);;
        System.out.println("2's complement: " + twos);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String bin = "1100";
        printOneAndTwosComplement(bin);
    }
}
 
// This code contributed by Rajput-Ji


Python3
# Python3 program to print 1's and 2's
# complement of a binary number
 
# Returns '0' for '1' and '1' for '0'
def flip(c):
    return '1' if (c == '0') else '0'
 
# Print 1's and 2's complement of
# binary number represented by "bin"
def printOneAndTwosComplement(bin):
 
    n = len(bin)
    ones = ""
    twos = ""
     
    # for ones complement flip every bit
    for i in range(n):
        ones += flip(bin[i])
 
    # for two's complement go from right
    # to left in ones complement and if
    # we get 1 make, we make them 0 and
    # keep going left when we get first
    # 0, make that 1 and go out of loop
    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
 
    i -= 1   
    # If No break : all are 1 as in 111 or 11111
    # in such case, add extra 1 at beginning
    if (i == -1):
        twos.insert(0, '1')
 
    print("1's complement: ", *ones, sep = "")
    print("2's complement: ", *twos, sep = "")
     
# Driver Code
if __name__ == '__main__':
    bin = "1100"
    printOneAndTwosComplement(bin.strip(""))
     
# This code is contributed
# by SHUBHAMSINGH10


C#
// C# program to print 1's and 2's complement of
// a binary number
using System;
 
class GFG
{
 
    // Returns '0' for '1' and '1' for '0'
    static char flip(char c)
    {
        return (c == '0') ? '1' : '0';
    }
 
    // Print 1's and 2's complement of binary number
    // represented by "bin"
    static void printOneAndTwosComplement(String bin)
    {
        int n = bin.Length;
        int i;
 
        String ones = "", twos = "";
        ones = twos = "";
 
        // for ones complement flip every bit
        for (i = 0; i < n; i++)
        {
            ones += flip(bin[i]);
        }
 
        // for two's complement go from right to left in
        // ones complement and if we get 1 make, we make
        // them 0 and keep going left when we get first
        // 0, make that 1 and go out of loop
        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;
            }
        }
 
        // If No break : all are 1 as in 111 or 11111;
        // in such case, add extra 1 at beginning
        if (i == -1)
        {
            twos = '1' + twos;
        }
 
        Console.WriteLine("1's complement: " + ones);;
        Console.WriteLine("2's complement: " + twos);
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        String bin = "1100";
        printOneAndTwosComplement(bin);
    }
}
 
// This code has been contributed by 29AjayKumar


输出:

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