2013-04-27 13 views
1

我瞎搞與位運算符,我試圖負字節轉換爲一個無符號的8位值,這是什麼人建議:爲什麼在JAVA中按位AND與字節做到這一點?

System.out.println(-20 & 0xFF); //bitwise AND on negative number and 255 

所以,這個完美的作品,並返回236 , 但爲什麼?據我所知:

00010100 //binary representation of -20 
11111111 //binary representation of 0xFF or 255 
-------- 
00010100 //it returns the same exact thing, so it's either -20 or 20 

它爲什麼工作?我想我錯過了一些非常簡單的事情,但我似乎無法理解它。

此外,如果我用低於256的正數進行操作,它將返回相同的數字。我似乎無法理解Java如何處理這些數字。

+1

-20!= 20所以表示形式也不一樣。 – 2013-04-27 13:07:10

回答

4

Java中的文字形式爲int。所以,當你說-20 & 0xFF,這是發生了什麼:

11111111 11111111 11111111 11101100 //-20 -ve nos are stored in 2's compliment form 
& 00000000 00000000 00000000 11111111 // 0xFF 
    -------- -------- -------- -------- 
    00000000 00000000 00000000 11101100 // 236 

由於negetaive值存儲在2的補形式,當您會藉此20 & 0xFF獲得價值236

,出現這種情況:

00000000 00000000 00000000 00010100 // 20 -ve nos are stored in 2's compliment form 
& 00000000 00000000 00000000 11111111 // 0xFF 
    -------- -------- -------- -------- 
    00000000 00000000 00000000 00010100 // 20 
+0

啊,我現在明白了。這可能是2的讚美形式,讓我困惑。所以讓我直截了當地說:如果我在-128和-1(含)之間保存一個負數,它將被保存爲256位的7位表示減去該數字,第8位僅用於表示是否爲負數或積極的,是嗎?現在,唯一讓我困惑的事情是,在第一個例子中,在-20的開頭添加了24 1。爲什麼是1,爲什麼不是0?這是現在唯一困擾我的事情。 – ZimZim 2013-04-27 13:30:03

+0

@ user1007059:如果你有一個'byte'變量,那麼第8位用於存儲符號。但是當你有一個文字時,就像在上面的例子中一樣,文字存儲爲'int',不管文字大小有多小。所以當你寫'-20&0xFF'時,兩個ints被創建爲每個32位,並且MSB,即第32位用於存儲符號。在第一個例子中,由於數字在2的恭維和2的恭維形式中存在前面的1,所以在第1個1之前的所有位都翻轉,即0變成1並且1變成0. – 2013-04-27 13:36:43

+0

好吧,謝謝,我現在明白了大部分都是這樣。我可以繼續搞亂位和字節,而不會覺得自己像個白癡:D – ZimZim 2013-04-27 14:15:11

1

字節是8個比特保持帶符號的值,並且可以是在範圍-128到127

最左邊的比特被用作符號位。

System.out.println(-20 & 0xFF);與字節無關,這是一個int操作。

的-20二進制表示,作爲一個字節是:1110_1100

1110_1100 & 1111_1111 = 1110_1100

如果你要簽名,還有焦炭一起玩,但你不會得到幸福。實際上,Java沒有未簽名。

底片保存在 '二進制補碼' 形式,例如:

1111_1111 == -1

但是,爲什麼?

在二進制補做一個負數,所有的位翻轉(1的補碼),並加1(製作二進制補碼 - 兩個操作)

所以

0000_0000 - Zero 
-0000_0001 - minus one 
--------- 
1111_1110 - Ones complement - (this would be xor 1111_1111) 
+0000_0001 - plus one - we're converting to 2s complement, not doing math 
--------- 
1111_1111 - -1 in 2s complement 
+0

我說「字節」,因爲我試着在一個字節裏面存儲-20,然後執行&0xFF的東西,它確實有效。 另外,11101100,會不會是-108?最左邊的位代表減號,其餘的代表實際的數字,這將是108.我在這裏錯過了什麼? – ZimZim 2013-04-27 13:13:58

+0

它被稱爲「二進制補碼」,我將編輯我的帖子 – 2013-04-27 13:15:24

+0

只有兩個地方缺少未簽名確實需要您額外關注:關係運算符和擴展轉換。切換到char大多是愚蠢的,因爲幾乎所有的操作都會導致一個帶有所有問題簽名問題的int(但現在隱藏在中間結果中)。瞭解二進制補碼的詳細信息,即使變量被視爲已簽名,也可以正確處理未簽名的數據。沒有足夠的知識替代,而不是使用java或任何其他語言。 – Durandal 2013-04-27 13:19:12

相關問題