Operasi Bit - Mengapa ~8=-9, ~-8=7 dalam javascript?
滿天的星座
滿天的星座 2017-05-18 10:59:22
0
5
944

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?

滿天的星座
滿天的星座

membalas semua(5)
PHPzhong

Kerana ~8 adalah tepat bagaimana -9 diwakili dalam komputer. . . .
32-bit integer unsigned boleh mewakili julat integer positif 0 ~ 2^32-1, yang boleh mewakili 2^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,这样,人看起来不方便,计算机也不方便。

你说的对,去反就是最大的值-当前的值 这是对于无符号整数来说的。 只是除了>>>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 -&gt 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. 🎜
function toUint32(x) {return x>>>0;}
function toInt32(x) { return x>>0;}

MaxUint32 = toUint32(-1);// -1 的二进制表示和 2^32 - 1 一样(32位整形来说)

console.log(MaxUint32) // 4294967295

console.log(8 + toUint32(~8) === MaxUint32)  // true
console.log(7 + toUint32(~7) === MaxUint32)  // true

//  下面几个与本问题无关,就当是扩展了,自己试试输出是什么。
console.log(MaxUint32 + 1)
console.log(toUint32(MaxUint32+1))
console.log(toUint32(MaxUint32+2))
巴扎黑

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

.

伊谢尔伦
~8=-9
8的二进制 11000 =》第一位是符号位,正数1,负数0
按位取反 =》所有位取反,再取补码
11000 取反=》 00111 补码(负数的补码,符号位不动,其它取反+1)=》 01000+1 =》01001(-9)

~-8=7?
-8的二进制 01000 =》第一位是符号位,正数1,负数0
按位取反 =》所有位取反,再取补码
01000 取反=》 10111 补码(正数的补码是其本身)=》 10111(7)
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!