4

我有一个 integer n,我想仅使用按位运算截断该数字的最后两位数字。

因此,在常规算术中,它就像n /= 100. 但是如何通过按位运算来完成呢?

谢谢,

(顺便说一下,这是在 C++ 中)

[编辑]:例如,给定数字1234,我想得到12。(截断最后两位数34

[Edit2:] 让我重新表述一下这个问题。我试图理解为什么一个应该截断数字的最后两位数字的特定函数在给出负输入时会搞砸。(而且我没有这个功能的代码)

这是一组输入及其相应的输出

-200901 ==> 186113241

-200801 ==> 186113242

-200701 ==> 186113243

-200601 ==> 186113244

-190001 ==> 186113350

-190101 ==> 186113349

-190201 ==> 186113348

-190301 ==> 186113347

4

2 回答 2

1

在这里你想除以一个常数:100

以下如何仅使用位移和加法进行乘法和除法?这是 Suraj Chandran 在他的评论中给出的,

您可以将其重新解释为乘以 1/100。

在底数 2 中,1/100 可以近似为 1/2^7 * ( 1/2^0 + 1/2^2 + 1/2^6+ 1/2^7+ 1/2^8+ 1/ 2^9 + 1/2^11+ 1/2^13+ 1/2^14+ 1/2^15+ 1/2^20+ 1/2^22 + 1/2^26 + 1/2^ 27 + 1/2^28 1/2^29)

所以你有和近似值 (n >> 0 + n >> 2 + n >> 6 + n >> 7 + n >> 8 + n >> 9 + n >> 11 + n >> 13 + n >> 14 + n >> 15 + n >> 20 + n >> 22 + n >> 26 + n >> 27 + n >> 28 + n >> 29) >> 7

这或多或少是您在遗留代码中所拥有的吗?

我不敢说这总是会给你正确的答案,因为我没有仔细检查这里的近似值的影响,并且在某些情况下很可能存在舍入问题。

在java代码中

剩余 = (( n>>0 ) + (n >> 2) + (n >> 6) + (n >> 7) + (n >> 8) + (n >> 9) + (n >> 11 ) + (n >> 13) + (n >> 14) + (n >> 15) + (n >> 20) + (n >> 22) + (n >> 26) + (n >> 27) + (n >> 28) + (n >> 29)) >> 7;

在http://ideone.com/8UlD7上添加了一个示例

我找不到通过按位运算替换加法的方法+无法用负值重现您的结果

于 2012-05-30T20:18:33.827 回答
0

好的,另一种方法。

1234 : 100 = 12, remainder 34

现在在二进制中,我希望我没有搞砸:

 100 1101 0010 : 110 0100 = 1100 Result
- 11 0010 0
-----------
   1 1011 00
  -1 1001 00
  ----------
     0010 001
    -       0
    ---------
      010 0010
     -       0
     ---------
       10 0010 remaining

玩得开心将其转换为算法。与 相比x /= 100,无论您如何操作,它都会非常缓慢。

于 2012-05-30T19:55:29.200 回答