Apa cara terbaik untuk mengatasi kenyataan bahwa SEMUA Java byte yang ditandatangani?

Di Jawa, tidak ada hal seperti itu sebagai unsigned byte.

Bekerja dengan beberapa tingkat rendah kode, kadang-kadang anda perlu untuk bekerja dengan byte yang memiliki nilai-nilai unsigned lebih besar dari 128, yang menyebabkan Java untuk menafsirkannya sebagai angka negatif karena MSB yang digunakan untuk mendaftar.

Apa's cara yang baik untuk bekerja di sekitar ini? (Mengatakan don't menggunakan Java bukan pilihan)

Hal ini sebenarnya mungkin untuk menyingkirkan jika pernyataan dan selain itu jika anda melakukan hal seperti ini.

byte[] foobar = ..;
int value = (foobar[10] & 0xff);

Cara ini Jawa doesn't menafsirkan byte sebagai angka negatif dan membalik tanda bit pada bilangan bulat juga.

Komentar (1)
Larutan

Ketika membaca salah satu nilai dari array copy itu menjadi sesuatu seperti pendek atau int dan manual mengkonversi angka negatif menjadi nilai positif yang seharusnya.

byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value

Anda dapat melakukan konversi yang sama saat menulis ke dalam array.

Komentar (4)

Menggunakan int umumnya lebih baik daripada menggunakan celana pendek karena java menggunakan 32-bit nilai-nilai secara internal pula (Bahkan untuk byte, kecuali dalam array) jadi menggunakan int akan menghindari yang tidak perlu konversi ke/dari nilai-nilai dalam bytecode.

Komentar (3)

Cara terbaik untuk melakukan sedikit manipulasi/unsigned byte adalah melalui menggunakan ints. Meskipun mereka menandatangani mereka memiliki banyak cadangan bit (32 total) untuk mengobati sebagai unsigned byte. Juga, semua operator matematika yang akan mengkonversi lebih kecil tetap presisi angka ke int. Contoh:

short a = 1s;
short b = 2s;
int c = a + b; // the result is up-converted
short small = (short)c; // must cast to get it back to short

Karena hal ini yang terbaik adalah untuk tetap dengan bilangan bulat dan masker untuk mendapatkan bit-bit yang anda tertarik. Contoh:

int a = 32;
int b = 128;
int foo = (a + b) | 255;

Berikut ini adalah beberapa info pada Java tipe primitif http://mindprod.com/jgloss/primitive.html

Terakhir sepele catatan, ada satu unsigned tetap presisi nomor di pulau Jawa. Itu adalah char primitif.

Komentar (0)

Mungkin anda bertaruh terbaik adalah untuk menggunakan integer daripada byte. Memiliki ruang untuk memungkinkan untuk angka yang lebih besar dari 128 tanpa overhead harus membuat sebuah objek khusus untuk mengganti byte.

Hal ini juga disarankan oleh orang-orang yang lebih pintar dari saya (semua orang)

Komentar (0)

Aku tahu ini sangat terlambat respon, tapi saya datang di thread ini ketika mencoba untuk melakukan hal yang sama. Masalah ini hanya mencoba untuk menentukan apakah Java byte >127.

Solusi sederhana adalah:

if((val & (byte)0x80) != 0) { ... }

Jika masalah sebenarnya adalah >128 sebaliknya, hanya menambahkan kondisi lain untuk itu jika pernyataan akan melakukan trik.

Komentar (0)

Saya kira anda hanya bisa gunakan untuk menyimpan mereka. Sangat tidak efisien, tapi benar-benar satu-satunya pilihan selain beberapa upaya hercules yang saya lihat.

Komentar (0)