JavaRush /Blog Jawa /Random-JV /Negasi bitwise - kenapa kaya ngono?
Alex Bolgov
tingkat
Ташкент

Negasi bitwise - kenapa kaya ngono?

Diterbitake ing grup
Halo kabeh :) Nalika maca artikel Operasi Bitwise, aku, kaya sawetara liyane, duwe pitakonan: kenapa, nalika kita ngowahi nomer 342, kita entuk -343. Iki katon ing artikel kasebut: Negasi bitwise - kok dadi - 1Wong-wong sing kepengin banget (kaya aku) duwe pitakonan: "hey, nanging 010101001 kurang saka 101010110, logis yen kudu kurang saka 342 lan positif." Kanthi ngetik menyang konverter nomer online utawa mriksa nganggo kode:
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
ora sengaja entuk liyane saka -343...
169
Oh, carane apik iku biyen, ing kelas ing program ing C, aku piye wae sedhela krungu soko bab digit tandha ing wilangan bulat. Sawise Googling sawetara wektu, aku saiki bisa nerangake apa jenis kewan iki. Negasi bitwise - kok dadi - 2Nyatane, ana sing ora akurat ing artikel kasebut, sing mbingungake. Yen dipriksa nganggo kode, apa sejatine asil ngowahi angka 342:
int a = 342;
System.out.println(Integer.toBinaryString(~a));
banjur kita bakal weruh asil rada beda
111111111111111111111111010101001
Kok ngono? Bab iku variabel ora bisa mung ngemot 101010110; nyatane, disimpen minangka
00000000000000000000000101010110
Sawise kabeh, variabel int njupuk 4 bita, i.e. 32 bit - 32 sel memori. Sawise inversi, pancen kabeh nomer diganti, i.e. lan "trim" anjog nul. Saiki teka bagean fun. Wiwit ing perwakilan binar tandha + utawa - ing ngarepe nomer ora bisa disimpen, ana siji trick: bit 1st banget tanggung jawab kanggo tandha lan sabenere bit tandha . Lan kabeh nomer disimpen miturut logika iki: nomer saka 00...000 kanggo 01...111 positif, wiwit saka 0 (i.e. saka 0 kanggo 2147483647) lan wiwit saka 10...000 kanggo 11... 111 negatif, wiwit saka paling cilik lan pungkasan karo -1 (i.e. -2147483648 kanggo -1).
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
Banjur sampeyan takon, "Oke, Navalny, kita bakal percaya sampeyan, nanging kenapa sampeyan mutusake yen iki istanane," nanging kepiye carane dadi -343 karo kabeh iki? Iku pancene prasaja. Kita mung bisa ngetung iki kanthi manual. Yen kita "motong" (utawa ngganti karo 0) dicokot pisanan saka versi binar saka asil nomer 342 ( 11111111111111111111111111111111111111111010101001 ) lan bali menyang wangun desimal.
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
banjur kita njaluk sing
011111111111111111111111010101001 = 2147483305
Nyatane, ing kene kita ora mung "memotong" 1 ing wiwitan, nanging nyuda 10000000000000000000000000000000 saka nomer iki. Apa sing bakal kita deleng:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
Iki nomer sing dibutuhake -343 :) Guys, iki postingan pertamaku ing kene, please like yen sampeyan seneng lan informatif (aku pengin ngumpulake kabeh prestasi 😄) Sampeyan bisa maca liyane babagan topik iki ing kene: Good luck kanggo kabeh lan matur nuwun kanggo perhatian sampeyan)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION