日期:2014-05-16  浏览次数:20348 次

关于JS位运算符的一点疑问。。。
突然看到这个问题

特意试了一下 
var a = ~~(-5.8);
alert(a); a = -5;

var a = Math.floor(-5.8);
alert(a); a = -6;


所以。。。。。。。


~~这个符号到底干嘛用的???

------解决方案--------------------
运行了你还不知道是什么用的,
var a = ~~(-5.8); 取不小于当前数的整数。
var a = Math.floor(-5.8);取不大于当前数的整数。
------解决方案--------------------
~ 运算是省略小数部分,然后增大1,再互取正反号。
~3.14 = -4
~~3.14 = ~-4 = 3
------解决方案--------------------
位运算的操作值要求是整数,它只是单纯的去掉小数部分,不论正负都不会改变整数部分

------解决方案--------------------
js中没有类型,所以没有整型和浮点型之分,没有32位整数和64位整数之分,但却保留了位运算,,,
一切还要从数的机内表示法说起。。。你懂的,就是所谓二进制

这里只说整型的二进制表示法,姑且说16位整型吧(js中整数好像是int64的,再大的数就自动变成浮点型了)。
额,突然思路断片了,记得是计算机导论课上讲的,让我想想....

好吧,我觉得LZ可能不想看这些,但是,作为一个程序员,必须知道这些,虽然你是js程序员。

Bingo!想起来了,继续:

计算机表示一个有符号整数,内部约定最高位表示符号位,1表示负数,0表示正数。
正数表示的数值,直接就是其转化为二进制的数值,负数的话,除最高位符号位,其他位取反+1就是其绝对值。

对了,这个叫补码表示法。
补码有个特点就是,各个位上的数取反+1就会得到其相反数。

16位有符号数的表示范围是:-32768--32767.(1000000000000000--0111111111111111)
再加上一个0,一共表示了65536(2^16)个数。

煮个栗子:
-1的二进制是:偶们用补码的特征,先写出1的二进制:0000000000000001 ,取反:1111111111111110 再加1:1111111111111111 .好了,16位的-1的二进制补码表示是16个1.

1110100111110101补码表示的数是多少?先取反0001011000001010,再加1:0001011000001011,转化为10进制是5643,因此,1110100111110101补码表示的数诗-5643.
============================================================

位运算中~,表示的是按位取反的意思,-1的二进制是16个1,按位取反就是16个0,也就是~-1=0.根据补码的特征:对一个整数按位取反再加1得到这个数的相反数;我们可以知道:
~X <==> -(X)-1

这就是#2的理论为什么正确的原因。
以上栗子为方便书写以16位为例,其他数位推广之。
其他位运算,&按位与、
------解决方案--------------------
按位或、^按位异或、<<按位左移、>>按位右移,脑补一下,应该很好理解。