Mengapa ketika saya mencoba menggeser bit untuk 11010100 2 , hasilnya adalah 110101000 2 , bukan 10101000 2 .
int a = Integer.parseInt("11010100", 2) << 1;
Saya mencoba melakukan ini:
int a = (byte)(Integer.parseInt("11010100", 2) << 1);
Tetapi jika nilai output lebih besar dari 128, semuanya menjadi minus, yang logis. Bagaimana saya bisa membuat jumlah bit tidak berubah?
int
s ataulong
s.Jawaban:
Mari kita selangkah demi selangkah.
Integer.parseInt("11010100", 2)
- ini adalah nilai int 212. Ini, omong-omong, tidak perlu; Anda hanya dapat menulis:0b11010100
.0b11010100 << 1
sama dengan0b110101000
, dan 424.Anda kemudian melemparkannya ke byte:
(byte)(0b11010100 << 1)
. Bit di luar 8 pertama semuanya dipotong, yang meninggalkan 0b10101000, yaitu -88. Minus, ya, karena dalam byte java ditandatangani.Anda kemudian secara diam-diam melemparkan -88 ini kembali ke int, saat Anda menetapkannya ke nilai int. Tetap -88, yang berarti semua bit teratas semua 1s.
Oleh karena itu, nilai akhirnya adalah
-88
.Jika Anda ingin melihat
168
sebagai gantinya (yang merupakan bit yang sama persis, tetapi ditampilkan tanpa tanda tangan alih-alih ditandatangani), trik yang biasa adalah dengan menggunakan& 0xFF
, yang menetapkan semua bit kecuali yang pertama menjadi 8, sehingga menjamin angka positif:sumber
int a
, jadi jika Anda memiliki& 0xFF
, maka Anda tidak perlu membuang sama sekali.int a = (0b11010100<< 1) & 0xFF;
Jika Anda ingin mengatur ke 0 semua bit lebih tinggi dari 8 bit terbawah, Anda bisa menggunakan bit-wise AND:
Keluaran:
sumber
Coba sesuatu seperti ini:
toUnsignedInt telah diperkenalkan di Java SE 8.
sumber