本文概述
1的补码二进制数的``0''是通过切换其中的所有位获得的另一个二进制数, 即将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++ 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
谢谢乌特卡什·特里维迪(Utkarsh Trivedi)对于上述解决方案。
另外, 带符号的数字通常使用2的补码表示。正值按原样存储, 负值按2的补码形式存储。需要额外一位来指示数字是正数还是负数。例如, char在C中为8位。如果对char使用2的补码表示形式, 则按原样存储127, 即01111111, 其中第一个0表示正数。但是-127被存储为10000001。
相关文章:
二进制字符串的2补码的有效方法
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。
参考文献:
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/