2013-04-04 27 views
6

I küçük endian bir ByteArray (içerik []) ve 2 byte değer yeniden oluşturmak için gereken kodJava bit düzeyinde çalışma

int b1 = 0xffff & (content[12]<<8 | 0xff & content[11]); 

bu hattı vardır. Bu kod ben bu

int b1 = 0xffff & (content[12]<<8 | content[11]); 

gibi yazmıştı ve sonuç doğru değildi sadece iyi ama testten önce işi yapar. Sorum şu, bu senaryoda neden 0xff gerekli?

+0

bayt imzalı tamsayı olarak yorumlanır ve bu örneğin, o (bayt) 0x80 (int) 0xffffff80 alır demektir çünkü. Buna işaret uzantısı denir. Yanıt için – Ingo

cevap

12

0xff çünkü iki faktörün birleşiminin gereklidir: Java

  1. Tüm tamsayı türleri harekete geçmeden önce (veya gerekiyorsa long) Bütün işleçleri int onların argümanları desteklemek
  2. imzalanır.

sonuç content[11] yüksek dereceden biraz ayarlanması durumunda, bu negatif bir int değere işareti genişletilmiş olmasıdır. &'un 0xff ile bir (pozitif) bayt değerine döndürmesi gerekir. Aksi takdirde content[12]<<8 sonucu, yüksek sipariş bayt tüm 1s olacak.

+0

Thx! Yüksek sipariş bit seti ile içerik [11] int olarak yayınlanacağını tahmin etmemiştim. İki değeri OR ile birleştirdiğimde, bit seviyesinde AS ARE olarak kullanılacağını düşündüm. Alkışlar – John

+1

@John Bu cevaptan memnunsanız (ve öyle görünüyorsanız), lütfen [kabul et] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer- iş). –

İlgili konular