【问题标题】:Adding binary integer without using + or -添加二进制整数而不使用 + 或 -
【发布时间】:2017-04-03 15:26:24
【问题描述】:

不使用 + 或 - 将两个整数相加。

这是我的解决方案。

class Solution {
public:
    int getSum(int a, int b) {
        int temp=a & b; 
        a=a^b;
        while (temp>0){
            b=temp<<1; 
            temp=a & b; 
            a=a^b;
        }
        return a; 
    }
};

但它不适用于 a=-12 的情况, b=-8。


将其与其他人的工作解决方案并列比较,他有:

class Solution {
public:
    int getSum(int a, int b) {
        int sum = a;

        while (b != 0)
        {
            sum = a ^ b;//calculate sum of a and b without thinking the carry 
            b = (a & b) << 1;//calculate the carry
            a = sum;//add sum(without carry) and carry
        }

        return sum;
    }
};

基本上是一样的。为什么我的解决方案不起作用?

【问题讨论】:

  • 因为你的错了。操作的顺序和位置很重要。
  • 我知道我错了。但是代码基本一样
  • 因为while (temp&gt;0) ...如果你&amp; 2个负数,你会得到另一个负数
  • 不,它们基本上不一样。再读一遍我写的,特别是第二句话。 abc 与背诵字母表时的 baccab 基本不同。
  • 如果我将while(temp&lt;0) 更改为while (temp != 0),你认为这会起作用吗?

标签: c++ binary bit-manipulation bit


【解决方案1】:

严格来说,您的解决方案和您正在比较的解决方案都是不正确的,除非您对 signedintegral 类型的表示做出具体假设。你的不同的原因是操作顺序。

解释是用 C 标准本身编写的。例如,来自 2011 ISO C 标准 (ISO/IEC 9899:2011) 第 6.5 节第 4 段。

某些运算符(一元运算符 ~ 和二元运算符 >、&、^ 和 |,统称为按位运算符)应具有整数类型的操作数。这些运算符返回的值取决于整数的内部表示,因此对于有符号类型具有实现定义和未定义方面。

如果ab 是否定的...,则这些问题会通过a &amp; b 之类的表达来解决......而您的示例两者都有。如果a 是否定的,a &lt;&lt; 1 会给出类似的担忧。

要消除您的问题,您需要使用 unsigned 值(按位运算符具有明确定义的行为)。如果您需要处理负值,只需以另一种方式跟踪符号(例如,bool 类型的另一个变量)。

在实践中,对于具有二进制补码表示的 signed 类型,按位运算可以正常工作。然而,依赖它的问题在于,实现不需要使用这样的表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 2012-01-22
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2018-09-02
    • 2013-10-26
    • 2017-08-21
    相关资源
    最近更新 更多