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