Maison  >  Questions et réponses  >  le corps du texte

Opérations sur les bits - Pourquoi ~8=-9, ~-8=7 en javascript ?

En étudiant les informations pertinentes sur les opérations au niveau du bit en JavaScript, je ne comprends vraiment pas l'opération d'inversion au niveau du bit. Je ne comprends pas pourquoi après l'inversion, ce n'est pas le nombre maximum - la valeur actuelle, mais ~8=-9, ~-. 8=7 ?

滿天的星座滿天的星座2731 Il y a quelques jours985

répondre à tous(5)je répondrai

  • PHPz

    PHPz2017-05-18 11:01:22

    Parce que ~8 est exactement la façon dont -9 est représenté dans les ordinateurs. . . .
    Un entier non signé de 32 bits peut représenter la plage d'entiers positifs de 0 ~ 2^32-1, qui peut représenter des entiers 2^32. 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,这样,人看起来不方便,计算机也不方便。

    你说的对,去反就是最大的值-当前的值 这是对于无符号整数来说的。 只是除了>>>Lorsqu'il est utilisé comme nombre signé, au lieu d'utiliser le bit le plus élevé comme bit de signe, c'est-à-dire -1, au lieu de définir directement le bit le plus élevé de 000..001 à 1, utilisez plutôt sa représentation numérique binaire correspondante de -1 + 2^32 = 2^32-1. Cette forme est appelée complément à deux. L'un des moyens les plus rapides de trouver le complément d'un nombre négatif est d'utiliser la valeur binaire de sa valeur absolue, en commençant par le bit faible, avant le premier 1 rencontré (y compris ce 1), inchangé, et les autres 1 deviennent 0, et 0 devient 1. Par exemple, le complément de -4 est 4 -> 00...0100 ->

    L'avantage est que cela réduit les règles de fonctionnement. Pour l'addition et la soustraction, l'ordinateur n'a pas à distinguer si c'est signé ou non. Par exemple, mise en forme 4 bits. La représentation binaire signée -5 + 4 = -1 est 1011 + 0100 = 1111, tandis que la représentation binaire non signée 11+4=15 La forme est également 1011 + 0100 = 1111. Si 1101 est utilisé pour représenter -5, alors l'addition signée est 1101 + 0100 = 1111. Ceci est gênant pour les personnes et également pour les ordinateurs. . 🎜 🎜Vous avez raison, l'inverse est valeur maximale - valeur actuelle Ceci est pour les entiers non signés. À l'exception de >>>, la valeur de retour des opérateurs de bits JS est un entier signé de 32 bits. 🎜
    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))

    répondre
    0
  • 巴扎黑

    巴扎黑2017-05-18 11:01:22

    Inverser ? NOT au niveau du bit, le résultat de l’exécution de NOT au niveau du bit est de renvoyer le complément de la valeur.

    répondre
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-18 11:01:22

    Parce que la négation au niveau du bit ici n'est pas la vraie négation au niveau du bit, mais 补码运算.

    Veuillez vous référer à cette question pour plus de détails : Comment comprendre la négation au niveau du bit en js ?

    répondre
    0
  • 阿神

    阿神2017-05-18 11:01:22

    L'opération d'inversion inversera également le bit de signe. Pour plus de détails, voir : "Programmation avancée JavaScript" 3.5.2 Opérations sur les bits

    .

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-18 11:01:22

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

    répondre
    0
  • Annulerrépondre