JavaRush /Java Blog /Random-ID /Negasi bitwise - mengapa demikian?
Alex Bolgov
Level 37
Ташкент

Negasi bitwise - mengapa demikian?

Dipublikasikan di grup Random-ID
Halo semuanya :) Saat membaca artikel Operasi Bitwise, saya, seperti beberapa orang lainnya, memiliki pertanyaan: mengapa, ketika kita membalikkan angka 342, kita mendapatkan -343. Begini tampilannya di artikel: Negasi bitwise - mengapa demikian - 1Mereka yang sangat ingin tahu (seperti saya) punya pertanyaan: “hei, tapi 010101001 kurang dari 101010110, masuk akal kalau harus kurang dari 342 dan positif.” Dengan mengetikkannya ke konverter nomor online mana pun atau memeriksanya menggunakan kode:
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
tiba-tiba kita mendapatkan sesuatu selain -343...
169
Oh, alangkah baiknya suatu ketika, di kelas pemrograman C, saya pernah mendengar sekilas tentang angka tanda dalam bilangan bulat. Setelah googling beberapa saat, kini saya bisa menjelaskan hewan apa ini. Negasi bitwise - mengapa demikian - 2Faktanya, ada ketidakakuratan dalam artikel tersebut sehingga membingungkan. Jika kita cek dengan kode tersebut apa sebenarnya hasil pembalikan bilangan 342 :
int a = 342;
System.out.println(Integer.toBinaryString(~a));
maka kita akan melihat hasil yang sedikit berbeda
1111111111111111111111010101001
Mengapa demikian? Masalahnya adalah suatu variabel tidak bisa hanya berisi 101010110; pada kenyataannya, variabel tersebut disimpan sebagai
000000000000000000000000101010110
Bagaimanapun, variabel int membutuhkan 4 byte, mis. 32 bit - 32 sel memori. Setelah inversi, semua angka benar-benar berubah, mis. dan "memangkas" angka nol di depan. Sekarang tiba bagian menyenangkan. Karena dalam representasi biner tanda + atau - di depan suatu bilangan tidak dapat disimpan, ada satu trik: bit pertama sebenarnya bertanggung jawab atas tanda tersebut dan justru merupakan bit tanda . Dan semua angka disimpan menurut logika ini: angka dari 00...000 hingga 01...111 adalah positif, mulai dari 0 (yaitu dari 0 hingga 2147483647) dan mulai dari 10...000 hingga 11... 111 adalah yang negatif, dimulai dari yang terkecil dan diakhiri dengan -1 (yaitu -2147483648 hingga -1).
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
Dan kemudian Anda bertanya, "Oke, Navalny, kami akan mempercayai Anda, tapi mengapa Anda memutuskan bahwa ini adalah istananya," tapi bagaimana jadinya -343 dengan semua ini? Ini sangat sederhana. Kita cukup menghitungnya secara manual. Jika kita “memotong” (atau mengganti dengan 0) bit pertama dari versi biner dari angka yang dihasilkan 342 ( 1111111111111111111111111111111111111111010101001 ) dan mengembalikannya ke bentuk desimal.
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
maka kita mendapatkan itu
01111111111111111111111010101001 = 2147483305
Sebenarnya di sini kita tidak hanya sekedar “memotong” 1 saja di awal, tapi mengurangkan 10000000000000000000000000000000000 dari angka tersebut, sekarang mari kita jumlahkan kembali, namun dalam bentuk desimal. Apa yang akan kita lihat:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
Ini nomor yang dibutuhkan -343 :) Guys, ini postingan pertama saya di sini, silakan like jika Anda suka dan informatif (saya sangat ingin mengumpulkan semua prestasi 😄) Anda dapat membaca lebih lanjut tentang topik ini di sini: Semoga sukses untuk semuanya dan terima kasih atas perhatian Anda)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION