$ echo $(( 255 ))
255
$ echo $(( 33 ))
33
$ echo $(( ~33 ))
-34
$ echo $(( ~255 ))
-256
$
dan kernel saya adalah:
$ uname -a
Linux HOSTNAME 3.2.0-40-generic-pae #64-Ubuntu SMP Mon Mar 25 21:44:41 UTC 2013 i686 i686 i386 GNU/Linux
PERTANYAAN: ~
untuk meniadakan nomor AFAIK. Tetapi mengapa ~33
menghasilkan -34
dan mengapa ~255
menghasilkan -256
?
bash
shell
arithmetic
peter gasko
sumber
sumber
Jawaban:
Halaman manual bash mengatakan:
Nomor yang ditandatangani biasanya disimpan dalam representasi komplemen Two :
Ini berarti jika Anda mengambil angka seperti 2 bitwise ditafsirkan sebagai 0010. Setelah negasi bitwise ini menjadi 1101, yang merupakan representasi -3.
sumber
Ini adalah hasil dari aritmatika komplemen dua.
~
adalah negasi bitwise yang membalikkan semua bit yang dioperasikan. Aritmatika komplemen dua berfungsi dengan membalik semua bit dan menambahkan 1. Karena Anda hanya membalik bit, tetapi tidak menambahkan satu, Anda mendapatkan nomor yang sama, terbalik, minus satu.Wikipedia memiliki artikel bagus tentang komplemen dua di sini .
Sebagai contoh:
0011
1101
0011
memberi Anda1100
, yaitu -4, karena Anda belum menambahkan 1.sumber
Operator ~ adalah operator bitwise TIDAK. Menggunakannya tidak sama dengan meniadakan angka.
Dari wikipedia , operasi bitwise TIDAK sama dengan mengambil pelengkap keduanya dari nilai minus satu:
Meniadakan bilangan biner sama dengan mengambil nilai dua komplemennya.
Menggunakan operator ~ NOT = ambil nilai satu komplemennya.
Dalam istilah yang lebih sederhana, ~ hanya membalik semua bit dari representasi biner .
Untuk contoh Anda:
Atau dalam aritmatika desimal, menggunakan rumus ~ x = -x - 1:
dan
sumber
Masalahnya adalah ~ adalah operator yang sedikit bijaksana. Karenanya, Anda meniadakan bit lebih banyak daripada yang mungkin Anda inginkan. Anda dapat melihat ini dengan lebih baik dengan mengonversi hasilnya menjadi hex misalnya:
versus apa yang Anda miliki:
Saya berasumsi Anda bermaksud meniadakan 0x33. Jika itu masalahnya maka ini akan berhasil:
Anda juga harus menggunakan & yang merupakan bit-wise dan operator untuk menghindari semua ff di awal.
sumber
Operator
~
(aritmatika) membalik semua bit , itu disebut operator negasi bitwise:Jadi, di tempat-tempat di mana konteksnya adalah aritmatika, ia mengubah angka dengan semua bit sebagai nol menjadi semua bit. A
$(( ~0 ))
mengkonversi semua bit dari representasi angka (biasanya 64 bit saat ini) ke semua yang ada.Angka dengan semua yang ditafsirkan sebagai angka negatif (bit pertama
1
)1
, atau sederhana-1
.Hal yang sama terjadi pada semua angka lainnya, misalnya:
$(( ~1 ))
membalik semua bit:Atau, dalam biner:
1111111111111111111111111111111111111111111111111111111111111110
Yang, ditafsirkan sebagai angka dalam representasi dua adalah:
Secara umum, persamaan matematika manusia
$(( ~n ))
adalah sama dengan$(( -n-1 ))
Dan (pertanyaan Anda):
sumber
Pertama, Anda harus memahami bahwa 33 adalah angka 32 bit atau 64 bit.
Untuk penyelenggaraan, saya mengambil angka delapan bit (= 1 byte)
desimal 33 dalam delapan bit: 00100001, membalikkan bit menghasilkan 11011110.
Karena bit pesanan tinggi adalah 1, itu adalah angka negatif.
Mencetak angka negatif, sistem mencetak tanda minus dan kemudian melakukan pelengkap dua pada angka negatif.
Dua komplemen adalah: membalik bit dan menambahkan 1.
11011110 ==> 00100001 ==> menambahkan 1 ==> 00100010 menghasilkan desimal 34 di belakang tanda minus.
sumber