实施Booth算法时的位移和类型铸造问题

时间:2016-02-17 03:44:37

标签: c algorithm casting bit-manipulation

我正在编写一个实现Booth's Algorithm以增加整数的程序。我只允许使用位级运算符,逻辑运算符和位移。我被允许一个循环的程序,以及一个将添加两个整数的函数。 我无法理解程序出了什么问题。当我使用按位运算符来屏蔽长long的一半时,我得到的值不正确。我在做什么错误的建议?也许我不明白如何正确掩盖。它也可能与类型铸造有关;我真的不确定。在此先感谢您的帮助!

以下是代码:

TimedRotatingFileHandler

3 个答案:

答案 0 :(得分:0)

返回函数Add()可能不是整数类型,但是返回int类型。如果我们添加两个整数可能会导致多于int类型。

答案 1 :(得分:0)

您不需要这些面具来解决问题。如果屏蔽是问题,只是按位或产品和乘法器,它将64位乘积的低32位设置为你想要的“右半”。然后,只需将产品向右移动32位,在加法函数调用中转换为int。这会将64位二进制文​​件截断为32位二进制文​​件。

PS。前一天晚上开始Babic的实验室任务可以确保你能够度过一个糟糕的时光......

答案 2 :(得分:0)

除了rslemos注意到的错误之外,还有两件事需要纠正:

  1. 整数常量0xFFFFFFFF000000000xFFFFFFFFFFFFFFFF需要带LL的后缀。
  2. product添加内容时,添加的值不得进行签名扩展。因此,改变

        product = (long long) Add (0, multiplier);
    

        product = (unsigned)multiplier; // do not sign-extend multiplier
    

                product = (long long) Add((int)product, productRHI);
    

                product |= (unsigned)productRHI;    // do not sign-extend productRHI
    

    (两次出现)。