Pada Operasi bitwise negasi C++, mengapa ~1 = -2?

pertanyaan ini muncul di salah satu Online Class C++ 3PSI2 oleh beberapa mahasiswa.

~1 bukan -1 karena ~1 bukan berarti minus dari 1. Melainkan semua bit dari nilai 1 di negasikan.sehingga jika 00000000 00000000 00000000 00000001 di negasikan akan menghasilkan 11111111 11111111 11111111 11111110.

Kalau demikian mengapa ~1 bukan -2147483646?

Bilangan integer negatif pada C++ tidak mempergunakan Sign-Magnitude tapi mempergunakan 2′s complement. karena itu nilai negasi dari 1 yang menghasilkan bilangan biner 11111111 11111111 11111111 11111110 adalah -2 bukan -2147483646.

Berikut ini penjelasannya:

bilangan negatif pada C++ menggunakan 2′s complement,
1 mempunyai bilangan biner
00000000 00000000 00000000 00000001

jika 1 dilakukan operasi bitwise negasi (~1) akan menjadi
11111111 11111111 11111111 11111110 atau -2 desimal

sebagai penjelasan:

bilangan biner 2 adalah
00000000 00000000 00000000 00000010

1′s complement dari bilangan tersebut:
11111111 11111111 11111111 11111101

2′s complement
11111111 11111111 11111111 11111101 + 1
=
11111111 11111111 11111111 11111110

untuk menjadikan -2 dapat dilakukan 2′s complement terhadap 2 yang menghasilkan 11111111 11111111 11111111 11111110 yang sama dengan dengan operasi bitwise negasi dari 1 (~1) di atas.

sebagai perbandingan:

~0 = -1
00000000 00000000 00000000 00000000 (0)
——————————————————- ~
11111111 11111111 11111111 11111111 (-1)

~1 = -2
00000000 00000000 00000000 00000001 (1)
——————————————————- ~
11111111 11111111 11111111 11111110 (-2)

~2 = -3
00000000 00000000 00000000 00000010 (2)
——————————————————- ~
11111111 11111111 11111111 11111101 (-3)

~127
00000000 00000000 00000000 01111111 (127)
——————————————————- ~
11111111 11111111 11111111 100000000 (-128)
dst

2147483646
Be Sociable, Share!

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>