Saya memiliki kode Java berikut:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
Hasilnya adalah 254 saat dicetak, tetapi saya tidak tahu cara kerja kode ini. Jika &
operatornya hanya bitwise, lalu mengapa tidak menghasilkan byte melainkan integer?
java
integer
byte
bitwise-and
dagronlund.dll
sumber
sumber
byte value = (byte) 0xfe;
Jawaban:
Ini menetapkan
result
ke nilai (unsigned) yang dihasilkan dari menempatkan 8 bitvalue
di 8 bit terendahresult
.Alasan mengapa hal seperti ini diperlukan adalah karena
byte
tipe yang ditandatangani di Java. Jika Anda baru saja menulis:maka
result
akan berakhir dengan nilai,ff ff ff fe
bukan00 00 00 fe
. Kehalusan lebih lanjut adalah bahwa&
didefinisikan untuk beroperasi hanya padaint
nilai 1 , jadi yang terjadi adalah:value
dipromosikan menjadiint
(ff ff ff fe
).0xff
adalahint
literal (00 00 00 ff
).&
diterapkan untuk menghasilkan nilai yang diinginkan untukresult
.(Intinya adalah bahwa konversi ke
int
terjadi sebelum para&
operator diterapkan.)1 Yah, kurang tepat. The
&
Operator bekerja padalong
nilai-nilai juga, jika salah satu operan adalahlong
. Tapi tidakbyte
. Lihat Spesifikasi Bahasa Java, bagian 15.22.1 dan 5.6.2 .sumber
0x
(atau0X
) memberi tahu Java bahwa literal integer yang mengikuti harus ditafsirkan sebagai hex (basis 16). Java juga mendukung0
awalan kosong untuk literal oktal dan awalan0b
(atau0B
) untuk literal biner. Lihat Spesifikasi Bahasa Java untuk info lebih lanjut dalam literal integer.0x
atau0b
dengan sendirinya (tanpa digit setelahnya) adalah sintaks ilegal di Java.fe
dalam 8-bit, komplemen dua sesuai dengan nilai desimal −2. Untuk mempertahankan nilai,Integer.valueOf(byte)
perlu menghasilkanff ff ff fe
(−2 dalam 32-bit, komplemen dua), bukan00 00 00 fe
(nilai desimal 254). Transformasi ini (daribyte
nilaife
menjadiint
nilaiff ff ff fe
) dikenal sebagai ekstensi tanda dan merupakan bagian dari spesifikasi bahasa Java. Tujuannyavalue & 0xff
adalah untuk membatalkan ekstensi tanda (yaitu, untuk mensimulasikan ekstensi nol, sesuatu yang tidak dimiliki Java).Dari http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
Hex literal 0xFF adalah int yang sama (255). Java mewakili int sebagai 32 bit. Ini terlihat seperti ini dalam biner:
Ketika Anda melakukan sedikit bijaksana AND dengan nilai ini (255) pada nomor apapun, itu akan menutupi (membuat NOL) semua kecuali 8 bit terendah dari nomor tersebut (akan seperti apa adanya).
& adalah sesuatu seperti% tapi tidak juga .
Dan mengapa 0xff? ini di ((kekuatan 2) - 1). Semua ((pangkat 2) - 1) (mis. 7, 255 ...) akan berperilaku seperti operator%.
Kemudian
Dalam biner, 0 adalah, semua nol, dan 255 terlihat seperti ini:
Dan -1 terlihat seperti ini
Saat Anda melakukan bitwise AND dari 0xFF dan nilai apa pun dari 0 hingga 255, hasilnya sama persis dengan nilainya. Dan jika ada nilai yang lebih tinggi dari 255 tetap hasilnya akan berada dalam 0-255.
Namun, jika Anda melakukannya:
Anda mendapatkan
00000000 00000000 00000000 11111111
, yang TIDAK sama dengan nilai asli -1 (11111111
adalah 255 dalam desimal).Periksa apakah bit tertentu disetel (1) atau tidak (0) lalu
Atur (1) bit tertentu
Setel ulang (0) bit tertentu
XOR
Perhatikan saja bahwa jika Anda melakukan operasi XOR dua kali, akan menghasilkan nilai yang sama.
Satu lagi logika dengan XOR adalah
Di atas berguna untuk menukar dua variabel tanpa suhu seperti di bawah ini
ATAU
sumber
Ini membantu mengurangi banyak kode. Ini kadang-kadang digunakan dalam nilai RGB yang terdiri dari 8 bit.
di mana 0xff berarti 24 (0) dan 8 (1) suka
00000000 00000000 00000000 11111111
Ini terlihat sebagian besar dalam kasus seperti ketika mencoba mengubah nilai warna dari format khusus ke nilai RGB standar (yang panjangnya 8 bit).
Penjelasan Hebat Lihat di sini
sumber
Dalam sistem 32 bit format nilai heksadesimal
0xff
mewakili00000000000000000000000011111111
yang255(15*16^1+15*16^0)
dalam desimal. dan bitwise & operator menutupi 8 bit paling kanan yang sama seperti pada operan pertama.sumber