JavaRush /Java Blog /Random-TL /Bitwise negation - bakit ganoon?
Alex Bolgov
Antas
Ташкент

Bitwise negation - bakit ganoon?

Nai-publish sa grupo
Kumusta sa lahat :) Habang binabasa ang artikulong Bitwise operations, ako, tulad ng iba, ay may tanong: bakit, kapag binaligtad natin ang numerong 342, makakakuha tayo ng -343. Ganito ang hitsura sa artikulo: Bitwise negation - bakit kaya - 1May tanong ang mga mausisa lalo na (tulad ko): “hey, pero ang 010101001 ay mas mababa sa 101010110, lohikal na dapat mas mababa sa 342 at positibo.” Sa pamamagitan ng pag-type nito sa anumang online number converter o pagsuri nito gamit ang code:
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
sa hindi inaasahang pagkakataon ay may nakuha kaming iba maliban sa -343...
169
Oh, gaano kabuti na noong unang panahon, sa isang klase sa programming sa C, kahit papaano ay may narinig akong sandali tungkol sa sign digit sa mga integer. Pagkatapos ng ilang sandali sa Googling, maaari ko na ngayong ipaliwanag kung anong uri ng hayop ito. Bitwise negation - bakit kaya - 2Sa katunayan, mayroong isang kamalian sa artikulo, na nakakalito. Kung susuriin natin ang code kung ano talaga ang resulta ng pagbaligtad ng numero 342:
int a = 342;
System.out.println(Integer.toBinaryString(~a));
pagkatapos ay makikita natin ang isang bahagyang naiibang resulta
1111111111111111111111111010101001
Bakit ganito? Ang bagay ay ang isang variable ay hindi maaaring maglaman lamang ng 101010110; sa katunayan, ito ay naka-imbak bilang
000000000000000000000000101010110
Pagkatapos ng lahat, ang isang int variable ay tumatagal ng 4 bytes, i.e. 32 bits - 32 memory cell. Pagkatapos ng pagbabaligtad, ganap na nagbabago ang lahat ng mga numero, i.e. at "pinutol" na mga nangungunang zero. Ngayon ay dumating ang masayang bahagi. Dahil sa binary na representasyon ang + o - sign sa harap ng isang numero ay hindi maiimbak, mayroong isang trick: ang pinakaunang bit ay talagang responsable para sa sign at ito mismo ang sign bit . At ang lahat ng mga numero ay nakaimbak ayon sa lohika na ito: ang mga numero mula 00...000 hanggang 01...111 ay positibo, simula sa 0 (i.e. mula 0 hanggang 2147483647) at simula sa 10...000 hanggang 11... 111 ay mga negatibo, simula sa pinakamaliit at nagtatapos sa -1 (i.e. -2147483648 hanggang -1).
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
At pagkatapos ay itatanong mo, "Okay, Navalny, maniniwala kami sa iyo, ngunit bakit mo napagpasyahan na ito ang kanyang palasyo," ngunit paano ito naging -343 sa lahat ng ito? Ito ay talagang simple. Maaari lang nating kalkulahin ito nang manu-mano. Kung "puputol" (o papalitan natin ng 0) ang pinakaunang bit mula sa binary na bersyon ng resultang numero 342 ( 11111111111111111111111111111111111111111010101001 ) at ibalik ito sa decimal na anyo.
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
pagkatapos makuha namin iyon
011111111111111111111111010101001 = 2147483305
Sa katunayan, dito hindi lang namin "pinutol" ang 1 sa simula, ngunit ibinawas ang 100000000000000000000000000000000 mula sa numerong ito. Ngayon, idagdag natin ito pabalik, ngunit sa decimal na anyo. Ano ang makikita natin:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
Eto po yung required number -343 :) Guys first post ko po dito paki like po kung nagustuhan nyo and it was informative (gusto ko po talaga kolektahin lahat ng achievements 😄) You can read more about this topic here: Good luck sa lahat at salamat sa iyong pansin)
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION