JS基础篇--JS按位非(~)运算符与~~运算符的理解分析
2017-01-11 22:26
441 查看
在SF上看到这个问题,js中怎么理解按位取反?
问题:
~ 运算符查看表达式的二进制表示形式的值,并执行位非运算。
Javascript 按位取反运算符 (~) ,对一个表达式执行位非(求非)运算。如 ~1 = -2; ~2 = -3;
js取反我只知道个!,但是~为什么也叫取反,他返回的又不是boolean类型?
~1,~2 的二进制又不是 -2 ,-3 ,怎么会转换成这么奇怪的值?
网友解答:
按位取反还真和
就来看看
将
按位取反 =
发现符号位(即最高位)为
末位加1取其补码 =
转换回十进制 =
有网友对上面的答案进行了三点补充,如下:
按位取反的运算规则这么奇怪并不是JavaScript独有的,而是所有的计算机语言都是这样的。这样做的主要原因是为了为了统一减法和加法,在计算机中,减法会变成加一个负数,而负数会以补码的形式存储。而这样主要是因为补码和数字的十进制数有这么转换关系,负数:
因为补码是针对负数存在的,那么只要数据类型有
如果没有无符号类型,而且也只是想要按位取反,而不是附带补码的按位取反,需要另外的方法。让全1的数据和当前数据做按位抑或就行了。比如,你有一个32位的数据a,需要对它做按位取反,那么这样就行了:
下面举个例子:
例2:
例3:
问题:
~ 运算符查看表达式的二进制表示形式的值,并执行位非运算。
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
相关文章推荐
- JS按位非(~)运算符与~~运算符的理解分析
- JS按位非(~)运算符与~~运算符的理解分析
- JS按位非(~)运算符与~~运算符的理解分析
- js中得~~是什么意思/JS按位非(~)运算符与~~运算符的理解分析
- js中得~~是什么意思/JS按位非(~)运算符与~~运算符的理解分析
- JS按位非(~)运算符与~~运算符的理解分析
- JS按位非(~)运算符与~~运算符的理解
- js基础练习---面向对象浅理解分析
- 理解JS 对象基础篇
- js对象基础实例分析
- 给傻瓜用的HTML5编程和JavaScript--第一部分--理解JS基础--第一章节--HTML,向JS说Hello
- JS运动基础框架实例分析
- js对象基础实例分析
- 理解JS中 || 和 &&运算符
- 笔记-【6】-JS中JSON的基础理解!
- 理解APCS-- ARM过程调用标准(bootloader代码分析理论基础)
- JS基础如何理解对象
- JS基础之undefined与null的区别分析
- 理解js 的作用域链 原型链 闭包 词法分析
- 【js技巧】~(按位非)运算符的妙用