我有一个整数n
,我想只使用按位运算来截断数字的最后两位数。
因此,在常规算术中,它就像n /= 100
一样简单。但是如何通过按位运算来完成?
谢谢,
(顺便说一下,这是用c ++编写的)
[编辑]:例如,给定数字1234
,我想获得12
。 (截断最后两位数34
)
[编辑2:]让我重新解释一下这个问题。我试图理解为什么一个特定的函数应该截断一个数字类型的最后两位数字,当给出一个负输入时。 (而且我没有此功能的代码)
以下是输入集及其相应的输出
-200901 ==> 186113241
-200801 ==> 186113242
-200701 ==> 186113243
-200601 ==> 186113244
-190001 ==> 186113350
-190101 ==> 186113349
-190201 ==> 186113348
-190301 ==> 186113347
答案 0 :(得分:1)
在这里你想要除以一个常数:100
按照Suraj Chandran在评论中提出的How can I multiply and divide using only bit shifting and adding? ,
您可以将其重新解释为乘以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>>>)+(n>>>)+(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;
上添加了一个示例我找不到通过按位操作替换添加内容的方法+无法使用负值重现结果
答案 1 :(得分: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
相比都会很慢。