2016-01-30 62 views
0

我正在用Java編寫左移算法,並且一直在做一些左移計算。所有這些數字鍵入爲字節,順便說一句。Java中的按位左移產生相同的值...?

比方說,我與8位整數的工作從-128到127

從我的計算

然後:

(-113 << 4) == (-65 << 4) == -16 

因爲

-113 == 1 0 0 0 1 1 1 1 
-113 << 4 == 1 1 1 1 0 0 0 0 == -16 

但這樣做

-65 == 1 0 1 1 1 1 1 1 
-65 << 4 == 1 1 1 1 0 0 0 0 == -16 

那麼左將-113移動4並向左移動-65將導致相同的值?不是所有的左移操作都能產生獨特的值嗎?或者我有這個權利嗎?

編輯:

我在Java中工作,我所有的數字是字節,而JVM拋出一個「錯誤:精度誤差的損失」,這是什麼也沉澱我的問題。 謝謝!

+0

問題不明確。你想弄清楚什麼? – Amit

+0

這是它的工作原理。 「操作數中的每一位都只是移動給定數量的位位置,並且空位位置被填充,通常用零(與循環移位形成對比)。」 https://en.wikipedia.org/wiki/Logical_shift –

+0

由於這些都是負值,所以您可能希望保留這個符號位,但正如Amit所說的,它並不完全清楚您要做什麼。 –

回答

1

在SO問題here中已經深入討論了這個問題和許多與換班有關的問題。它還解釋了爲什麼使用帶符號的表達式時您的位的計數不同。

關於你的問題:

來自不同源的相同的值值你遇到的問題來自於你扔信息路程左移位出單詞的事實。以前與數字相關的信息攜帶位之一在兩種情況下都成爲符號位。

如果你也只會給三位都轉移-16,你甚至結束了一個正數:

0 1 1 1 1 0 0 0 = 120 

而且,如果你移出所有位(<< 8),你會也結束在相同的值:

0 0 0 0 0 0 0 0 = 0 

所以你確實可以通過移動不同值的位來得到相同的數字。

我希望能回答你的問題。

+0

謝謝,1月有道理! – Dimpermanence

+0

很高興幫助。如果你想要描述你所描述的行爲(即不會丟失信息並且總是得到不同的數字),你可能想看看**旋轉**而不是移位。 –