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

本文概述

  • 建议:在继续解决方案之前, 请先在"实践"上解决它。
  • C ++
  • Java
  • Python3
  • C#
给定二进制数作为字符串, 请打印其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 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/

    推荐阅读