# 算法题：如何实现1和2的二进制补码？

2021年3月21日17:07:50 发表评论 677 次浏览

## 本文概述

1的补码二进制数的``0''是通过切换其中的所有位获得的另一个二进制数, 即将0位转换为1, 将1位转换为0。

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

2的补码

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

## C ++

``````// C++ program to print 1's and 2's complement of
// a binary number
#include <bits/stdc++.h>
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``````

http://qa.lsbin.org/6439/write-program-calculate-ones-and-twos-complement-of-number

http://geeksquiz.com/whats-difference-between-1s-complement-and-2s-complement/ 