2013-04-09 62 views
3

我發現這個代碼算術編碼器,我有點困惑,評論中提到的值來自哪裏。按位運算Java - 從長到二進制

任何人都可以通過這些操作一步一步發生什麼?

protected final long STATE_SIZE = 32; // Number of bits for 'low' and 'high'. Must be in the range [1, 62] (and possibly more restricted). 
    protected final long MASK  = (1L << (STATE_SIZE - 0)) - 1; // 111...111, all ones 

這些都是我的假設至今:

  • 「面具」的定義是由32設定爲1
  • 然後轉移這一個龍(我認爲)將給予10萬... 00(這是我在java中已經驗證了自己。
  • 然後我會被卡住。我不知道怎麼了「-1」,使他們都變爲1的

我使用此代碼嘗試了一下自己:

long STATE_SIZE = 32; 
     long shifted = 1L << STATE_SIZE-0; 
     long shiftedMinusOne = shifted -1; 
     System.out.println("Shifted: " + shifted); 
     System.out.println("Shifted Minus One: " + shiftedMinusOne); 
     System.out.println("Shifted Binary: " + Long.toBinaryString(shifted)); 
     System.out.println("Shifted Minus One Binary: " + Long.toBinaryString(shiftedMinusOne)); 

而且我的輸出是:

Shifted: 4294967296 
Shifted Minus One: 4294967295 
Shifted Binary: 100000000000000000000000000000000 
Shifted Minus One Binary: 11111111111111111111111111111111 

誰能告訴我,如果我做錯了什麼,或者爲什麼-1使他們全是1?

+0

做了任何答案回答你的問題? – 2013-04-09 12:49:21

+0

我剛剛意識到這個問題有多愚蠢。我如此沉浸在我所做的事情中,以至於我簡化了最簡單的事情。感謝大家回答! – 2013-04-09 15:36:22

回答

2

你有沒有意識到,二進制操作:

100000000000000000000000000000000 - 000000000000000000000000000000001 
    = 011111111111111111111111111111111 
3

請注意長度差異:

100000000000000000000000000000000 - 1 
= 11111111111111111111111111111111 

這是一個正確的二進制減法。你正在做的好:)

2

-1改變二元100001111出於同樣的原因,它改變

  • 小數100009999
  • 六角10000ffff
  • 100007777

二進制ist只是另一個數字表示,恰好只有兩個數字。

2

沒有什麼錯,你在做什麼?

4294967296 = 2^32

數量系列:100000000000000000000000000000000 = 4294967296(34位數字)

編號系列:11111111111111111111111111111111 = 4294967295(33位數字)

如果您瞭解數字在二進制中的表示方式,則應該將其清除。

另外我相信MASK的想法是讓你有一系列的111111 ....s與其他數字進行按位與或按位與或,以做出漂亮的數學。

乾杯。

1

4294967296 = 2^32 = 100000000000000000000000000000000(位32被置位)
4294967295 = 2^31 + 2^30 ... + 2^1 + 2^0(比特0到31被設置)