Operasi Bit - Mengapa ~8=-9, ~-8=7 dalam javascript?
滿天的星座2017-05-18 10:59:22
0
5
987
Mengkaji maklumat yang berkaitan tentang operasi bitwise dalam JavaScript, saya benar-benar tidak faham operasi penyongsangan bitwise. Saya tidak faham mengapa selepas penyongsangan, ia bukan nombor maksimum - nilai semasa, tetapi ~8=-9, ~-. 8=7?
你说的对,去反就是最大的值-当前的值 这是对于无符号整数来说的。 只是除了>>>Apabila digunakan sebagai nombor yang ditandatangani, bukannya menggunakan bit tertinggi sebagai bit tanda, iaitu -1, bukannya terus menetapkan bit tertinggi 000..001 hingga 1, Sebaliknya, gunakan perwakilan nombor perduaan yang sepadan -1 + 2^32 = 2^32-1. Bentuk ini dipanggil pelengkap dua. Salah satu cara terpantas untuk mencari pelengkap nombor negatif ialah menggunakan nilai perduaan nilai mutlaknya, bermula dari bit rendah, sebelum 1 pertama ditemui (termasuk 1 ini), tidak berubah, dan 1 lain menjadi 0, dan 0 menjadi 1. Contohnya, pelengkap bagi -4 ialah, 4 -> 00...0100 -> 11...1100
;
🎜Kelebihan ini ialah ia mengurangkan peraturan operasi Untuk penambahan dan penolakan, komputer tidak perlu membezakan sama ada ia ditandatangani atau tidak. Sebagai contoh, pembentukan 4-bit. Perwakilan binari -5 + 4 = -1 yang ditandatangani ialah 1011 + 0100 = 1111, manakala perduaan 11+4=15 yang tidak ditandatangani Borang juga 1011 + 0100 = 1111. Jika 1101 digunakan untuk mewakili -5, maka penambahan yang ditandatangani ialah 1101 + 0100 = 1111 Ini menyusahkan orang dan juga menyusahkan komputer . 🎜
🎜Anda betul, songsangan ialah nilai maksimum - nilai semasa Ini adalah untuk integer yang tidak ditandatangani. Kecuali >>>, nilai pulangan operator bit JS ialah integer 32-bit yang ditandatangani. 🎜
Kerana ~8 adalah tepat bagaimana -9 diwakili dalam komputer. . . .
32-bit integer unsigned boleh mewakili julat integer positif
0 ~ 2^32-1
, yang boleh mewakili2^32
integer.0 ~ 2^32-1
的正整数范围,这样可以表示2^32
个整数。当作为有符号数的时候,不是把最高的比特位作为符号位,即
-1
不是直接把000..001
的最高bit置为 1 ,而是使用其-1 + 2^32
=2^32-1
对应的二进制数表示。这种形式叫做补码。一种最快的求负数补码的方式是,其绝对值的二进制,从低位开始,遇到的第一个 1 之前(包括这个1)不变,其他的 1 变 0, 0 变 1。 比如 -4 的补码是, 4 ->00...0100
->11...1100
这样做的好处是,减少运算规则,对于加法和减法,计算机不必区分是不是有符号的。比如 4 位的整形。 有符号的
-5 + 4 = -1
二进制表示是1011 + 0100 = 1111
,而无符号的11+4=15
二进制形式也是1011 + 0100 = 1111
。如果用1101
表示-5
那么有符号加法就是1101 + 0100 = 1111
,这样,人看起来不方便,计算机也不方便。你说的对,去反就是
; 🎜Kelebihan ini ialah ia mengurangkan peraturan operasi Untuk penambahan dan penolakan, komputer tidak perlu membezakan sama ada ia ditandatangani atau tidak. Sebagai contoh, pembentukan 4-bit. Perwakilan binari最大的值-当前的值
这是对于无符号整数来说的。 只是除了>>>
Apabila digunakan sebagai nombor yang ditandatangani, bukannya menggunakan bit tertinggi sebagai bit tanda, iaitu-1
, bukannya terus menetapkan bit tertinggi000..001
hingga 1, Sebaliknya, gunakan perwakilan nombor perduaan yang sepadan-1 + 2^32
=2^32-1
. Bentuk ini dipanggil pelengkap dua. Salah satu cara terpantas untuk mencari pelengkap nombor negatif ialah menggunakan nilai perduaan nilai mutlaknya, bermula dari bit rendah, sebelum 1 pertama ditemui (termasuk 1 ini), tidak berubah, dan 1 lain menjadi 0, dan 0 menjadi 1. Contohnya, pelengkap bagi -4 ialah, 4 ->00...0100
->11...1100
-5 + 4 = -1
yang ditandatangani ialah1011 + 0100 = 1111
, manakala perduaan11+4=15
yang tidak ditandatangani Borang juga1011 + 0100 = 1111
. Jika1101
digunakan untuk mewakili-5
, maka penambahan yang ditandatangani ialah1101 + 0100 = 1111
Ini menyusahkan orang dan juga menyusahkan komputer . 🎜 🎜Anda betul, songsangan ialah>>>
, nilai pulangan operator bit JS ialah integer 32-bit yang ditandatangani. 🎜Terbalikkan? Bitwise NOT, hasil daripada melakukan bitwise NOT adalah untuk mengembalikan pelengkap nilai.
Sebab penafian bitwise di sini bukanlah penafian bitwise sebenar, tetapi
补码运算
.Sila rujuk soalan ini untuk butiran: Bagaimana untuk memahami penolakan bitwise dalam js?
Operasi penyongsangan juga akan menyongsangkan bit tanda Untuk butiran, lihat: "Pengaturcaraan Lanjutan JavaScript" 3.5.2 Operasi Operasi Bit
.