JavaRush /Blog Java /Random-MS /Penafian bitwise - mengapa begitu?
Alex Bolgov
Tahap
Ташкент

Penafian bitwise - mengapa begitu?

Diterbitkan dalam kumpulan
Hello semua :) Semasa membaca artikel Operasi Bitwise, saya, seperti beberapa orang lain, mempunyai soalan: mengapa, apabila kita menyongsangkan nombor 342, kita mendapat -343. Beginilah rupanya dalam artikel: Penafian bitwise - kenapa begitu - 1Mereka yang sangat ingin tahu (seperti saya) mempunyai soalan: "hei, tetapi 010101001 kurang daripada 101010110, adalah logik bahawa ia sepatutnya kurang daripada 342 dan positif." Dengan menaipnya ke dalam mana-mana penukar nombor dalam talian atau menyemaknya menggunakan kod:
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
tanpa disangka kita dapat sesuatu selain daripada -343...
169
Oh, alangkah baiknya suatu ketika dahulu, dalam kelas pengaturcaraan dalam C, saya entah bagaimana secara ringkas mendengar sesuatu tentang digit tanda dalam integer. Selepas Googling seketika, saya kini boleh menerangkan jenis haiwan ini. Penafian bitwise - kenapa begitu - 2Malah, terdapat ketidaktepatan dalam artikel itu, yang mengelirukan. Jika kita menyemak dengan kod apakah sebenarnya hasil penyongsangan nombor 342:
int a = 342;
System.out.println(Integer.toBinaryString(~a));
maka kita akan melihat hasil yang sedikit berbeza
1111111111111111111111111010101001
Kenapa jadi begini? Masalahnya ialah pembolehubah tidak boleh hanya mengandungi 101010110; sebenarnya, ia disimpan sebagai
000000000000000000000000101010110
Lagipun, pembolehubah int mengambil 4 bait, i.e. 32 bit - 32 sel memori. Selepas penyongsangan, benar-benar semua nombor berubah, i.e. dan sifar pendahuluan "dipotong". Sekarang datang bahagian yang menyeronokkan. Oleh kerana dalam perwakilan binari tanda + atau - di hadapan nombor tidak boleh disimpan, terdapat satu helah: bit pertama sebenarnya bertanggungjawab untuk tanda dan tepatnya bit tanda . Dan semua nombor disimpan mengikut logik ini: nombor dari 00...000 hingga 01...111 adalah positif, bermula dari 0 (iaitu dari 0 hingga 2147483647) dan bermula dari 10...000 hingga 11... 111 adalah negatif, bermula dari yang terkecil dan berakhir dengan -1 (iaitu -2147483648 hingga -1).
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
Dan kemudian anda bertanya, "Baiklah, Navalny, kami akan mempercayai anda, tetapi mengapa anda memutuskan bahawa ini adalah istananya," tetapi bagaimana ia menjadi -343 dengan semua ini? Ia sangat mudah. Kita hanya boleh mengira ini secara manual. Jika kita "memotong" (atau menggantikan dengan 0) bit pertama daripada versi perduaan nombor yang terhasil 342 ( 11111111111111111111111111111111111111111010101001 ) dan kembalikannya kepada bentuk perpuluhan.
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
maka kita dapat itu
011111111111111111111111010101001 = 2147483305
Sebenarnya, di sini kita bukan sahaja "memotong" 1 pada mulanya, tetapi menolak 10000000000000000000000000000000 daripada nombor ini. Sekarang mari tambahkannya semula, tetapi dalam bentuk perpuluhan. Apa yang akan kita lihat:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
Ini adalah nombor yang diperlukan -343 :) Guys, ini adalah catatan pertama saya di sini, sila like jika anda suka dan ia bermaklumat (saya benar-benar ingin mengumpul semua pencapaian 😄) Anda boleh membaca lebih lanjut mengenai topik ini di sini: Semoga berjaya kepada semua dan terima kasih atas perhatian anda)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION