美文网首页
JS按位非(~)运算符与~~运算符的理解分析

JS按位非(~)运算符与~~运算符的理解分析

作者: 我的昵称好听吗 | 来源:发表于2019-07-12 10:38 被阅读0次

原文地址: https://www.cnblogs.com/moqiutao/p/6275483.html

~ 运算符查看表达式的二进制表示形式的值,并执行位非运算。
Javascript 按位取反运算符 (~) ,对一个表达式执行位非(求非)运算。如 ~1 = -2; ~2 = -3;

js取反我只知道个,但是~为什么也叫取反,他返回的又不是boolean类型?

~1~2的二进制又不是-2-3,怎么会转换成这么奇怪的值?

网友解答

按位取反还真和boolean没多大关系,大体流程是这样的:

就来看看~1的计算步骤

将1(这里叫:原码)转二进制 = 00000001
按位取反 = 11111110
发现符号位(即最高位)为1(表示负数),将除符号位之外的其他数字取反 = 10000001
末位加1取其补码 = 10000010
转换回十进制 =-2

有网友对上面的答案进行了三点补充,如下:

按位取反的运算规则这么奇怪并不是JavaScript独有的,而是所有的计算机语言都是这样的。这样做的主要原因是为了为了统一减法和加法,在计算机中,减法会变成加一个负数,而负数会以补码的形式存储。而这样主要是因为补码和数字的十进制数有这么转换关系,负数:补码(x) = -x - 1,正数:补码(x) = x

因为补码是针对负数存在的,那么只要数据类型有无符号数,就没有这样的烦恼了,比如C语言有无符号整型,就能对无符号整型直接按位取反。
如果没有无符号类型,而且也只是想要按位取反,而不是附带补码的按位取反,需要另外的方法。让全1的数据和当前数据做按位抑或就行了。比如,你有一个32位的数据a,需要对它做按位取反,那么这样就行了:0xFFFF ^ a

var a = 0x8321;
console.log(a.toString(2));
console.log((0xFFFF ^ a).toString(2));


//1000001100100001
//111110011011110   => 左边最高位是0,被隐藏了。

下面举个例子:

var n = -4.9;
console.log(n); //4.9
n = ~n;
console.log(n);//3
n = ~n;
console.log(n);//4

例2:

var n = 4.2;
console.log(n); //4.2
n = ~n;
console.log(n);//-5
n = ~n;
console.log(n);//4

例3:

var n = 4;
console.log(n); //4
n = ~n;
console.log(n);//-5
n = ~n;
console.log(n);//4
 

相关文章

  • 理解C语言位运算符

    位运算符 位运算符包括:& 、|、^、~、<<、>> 分析 & 按位与操作,按二进制位进行"与"运算。| 按位或运...

  • JS按位非(~)运算符与~~运算符的理解分析

    原文地址: https://www.cnblogs.com/moqiutao/p/6275483.html ~ 运...

  • 基础运算符

    [使1. 按位与运算符(&](#1. 按位与运算符(&)[按位或运算符 | ](#2. 按位或运算符(|)) 1....

  • C语言专题-位运算符和逻辑运算符

    位运算符 位运算符:按位与,按位或,按位非,按位亦或 1.按位与: &都为1则为1 2.按位或: |有一个为1 ...

  • 高级运算符(Advanced Operators)

    目录 [toc] 位运算符 1. 按位取反运算符~ 2. 按位与运算符& 3. 按位或运算符| 4. 按位异或运算...

  • 高级运算符

    1:位运算 1.1:按位取反运算符(~) 例子 1.2:按位与运算符 例子 1.3:按位或运算符 例子 1.4:按...

  • C语言-按位逻辑运算符和位移运算符

    按位逻辑运算符 按位与运算符(bitwise AND operator) a & b 按位计算a和b的逻辑与; 按...

  • 位运算符

    按位运算符有6个 & 按位与| 按位或^按位异或~取反>>右移<<左移 1 、& 运算符 &是二元运算符,它以特定...

  • Java 位运算

    首先,在Java中,运算符有以下这些: 按位与 & 按位或 | 按位异或 ^ 按位非 ~ 左移 << 右移 >> ...

  • java中位运算技巧

    位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。 运算符 含义 描述 【&】 按位与 如果两个...

网友评论

      本文标题:JS按位非(~)运算符与~~运算符的理解分析

      本文链接:https://www.haomeiwen.com/subject/bvzskctx.html