算法题:如何实现1和2的二进制补码?

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

本文概述

给定二进制数作为字符串, 请打印其1和2的补码

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/

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: