2016-01-23 56 views
3

此方法BigInteger.bitCount()「返回此BigInteger的二進制補碼錶示中與其符號位不同的位數。」瞭解負數的java BigInteger.bitCount方法

如果數是正的,它是在1號位的計數。

我很難得到正確的負數。

例如,數-1377605392的二進制表示爲-1010010000111001001011100010000。它有12個1和19個0。

但java代碼BigInteger.valueOf((long)-1377605392)給出的結果 !!

請問這個15是如何計算的?

+0

二進制表示是無關緊要的。看到你自己的報價。什麼是相關的是*補碼*表示。 – EJP

回答

2

一個二進制數的二進制補碼錶示的意思是:

  • 減去1
  • 開關所有1到0和0至1

比較的-1377605392二的補碼與對應的正數:

1111111111111111111111111111111110101101111000110110100011110000 
0000000000000000000000000000000001010010000111001001011100010000 

正如你所看到的,所有的位都翻轉了,e除了尾隨的零。

但是,在BigInteger中,負數以絕對值(即:正值)存儲爲單獨的符號位,因此要計算負數中的0的數量,粘貼的代碼將計算1在絕對值中,加上尾部零點的數量(仍爲0)並減去1(對於仍然存在的最後1點)

使用二進制補碼的原因是它使基本算術變得非常簡單,邏輯可以忽略符號。例如(使用8位數字爲簡單起見):

6 = 00000110 
-2 = 11111110 
4 = 00000100 (adding together with carry) 

你應該做的更小的數字紙張索姆excercises瞭解如何工作的。