[英]bitwise operation(s) to truncate the last two digits of a number
我有一個整數n
,我想只使用按位運算截斷數字的最后兩位數。
因此,在常規算術中,它就像n /= 100
一樣簡單。 但是如何通過逐位運算來完成這項工作?
謝謝,
(順便說一下,這是用c ++編寫的)
[編輯]:例如,給定數字1234
,我想得到12
。 (截斷最后兩位數34
)
[編輯2:]讓我重新解釋一下這個問題。 我試圖理解為什么一個特定的函數應該截斷一個數字類型的最后兩位數字,當給出一個負輸入時。 (我沒有這個功能的代碼)
這是輸入集及其相應的輸出
-200901 ==> 186113241
-200801 ==> 186113242
-200701 ==> 186113243
-200601 ==> 186113244
-190001 ==> 186113350
-190101 ==> 186113349
-190201 ==> 186113348
-190301 ==> 186113347
在這里你想要除以常數: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上添加了一個示例
我找不到通過按位操作替換添加的方法+無法使用負值重現結果
好的,另一種方法。
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
慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.