本文概述
- 建议:在继续解决方案之前, 请先在"实践"上解决它。
- C ++
- Java
- Python3
- C#
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 1as in 111or11111;
// 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 numberclass 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'
breaki - = 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: 00112'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
【算法题(如何实现1和2的二进制补码())】http://geeksquiz.com/whats-difference-between-1s-complement-and-2s-complement/
推荐阅读
- 2D和2.5D内存组织是什么(有什么区别?)
- 计算将N表示为1,3和4的和的方法|算法题
- 算法题(如何连接树中相同层级的节点())
- 算法题(如何实现求和树())
- 如何解决0-1背包问题(| DP-10(动态规划))
- C/C++棘手程序集锦和详细介绍
- 6秘技让xp系统迅速完成开关机
- 伪IE图标删除?高手简单搞定
- 高手教你辨别ARP欺骗原理及防范被骗