leetcode 371. Sum of Two Integers | 371. 两整数之和(补码运算)

清疚 2022-08-30 11:46 231阅读 0赞

题目

https://leetcode.com/problems/sum-of-two-integers/
在这里插入图片描述

题解

根据 related topics 可知,本题考察二进制运算。
在这里插入图片描述
第一次提交的时候,没想到输入包含负数,于是又调了好久。

既然题目是二进制运算,就借此机会复习一下补码吧。

需要知道:

  • 正数的补码 = 其本身
  • 负数的补码 = 源码取反 + 1

补码的运算如下,参考:补码加减法运算
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. class Solution {
  2. public int getSum(int a, int b) {
  3. int[] binA = toBinary(a);
  4. int[] binB = toBinary(b);
  5. int[] binSum = addBinary(binA, binB);
  6. int res = binToDec(binSum);
  7. return res;
  8. }
  9. // 二进制取反
  10. public void negateBinary(int[] arr) {
  11. for (int i = 0; i < 32; i++) {
  12. arr[i] = 1 - arr[i];
  13. }
  14. }
  15. // 二进制(补码)->十进制
  16. public int binToDec(int[] arr) {
  17. boolean minus = false;
  18. if (arr[31] == 1) { // 若补码符号位为1
  19. minus = true;
  20. negateBinary(arr); // 取反
  21. arr = addBinary(arr, toBinary(1)); // 加1
  22. }
  23. int sum = 0;
  24. for (int i = 0; i < 32; i++) {
  25. sum += arr[i] * Math.pow(2, i);
  26. }
  27. if (minus) sum *= -1;
  28. return sum;
  29. }
  30. // 二进制加法
  31. public int[] addBinary(int[] a, int[] b) {
  32. int carry = 0;
  33. int[] sum = new int[32];
  34. for (int i = 0; i < 32; i++) {
  35. int t = a[i] + b[i] + carry;
  36. carry = t >= 2 ? 1 : 0;
  37. sum[i] = t % 2;
  38. }
  39. return sum;
  40. }
  41. // 十进制->二进制(补码)
  42. public int[] toBinary(int n) {
  43. int abs = Math.abs(n);
  44. int[] arr = new int[32];
  45. int size = 0;
  46. while (abs != 0) {
  47. arr[size++] = abs % 2;
  48. abs /= 2;
  49. }
  50. if (n < 0) {
  51. negateBinary(arr);
  52. arr = addBinary(arr, toBinary(1));
  53. }
  54. return arr;
  55. }
  56. }

后来看了评论区,才知道这题真正的考察点,以及一些其他的位运算技巧,可以参考:
A summary: how to use bit manipulation to solve problems easily and efficiently
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,231人围观)

还没有评论,来说两句吧...

相关阅读