Javascript负数右移与逻辑右移
javascript否定和逻辑右移算术右移是非常混乱的,特别是逻辑右移。你会发现即使是一个很小的负数,右后,也会得到一个巨大的数字,这是为什么呢在符号位原逻辑移位将连同正确的整体移动,这是无符号数的移动相当,其结果是一个正数,因为符号位不存在。第一逻辑移位生成的数是32,那么负的符号位为1,这意味着从第三十二点符号的位置被1填充,这个数字不能如1、逻辑移位形式为0 1111111111111111 1111111111111111,这个数字是积极的作为一种治疗!所以把1逻辑移到右N位,最后的结果都是1!
左移位操作保留数字的符号位。例如,如果移动5—2位,则得到64,而不是64。符号仍然存储在第三十二位吗是的,但这是ECMAscript的背景,和开发商不能直接进入第三十二位数。即使输出的二进制字符串是负的,消极的形式(例如,2将显示为10。)
符号右移运算
一个符号右移运算符用两个较大的数字($ LT)表示,它在32位数字总体上是正确的,同时保留符号数(加号或减号)。符号右移运算符正好与左移位操作相反。例如,移动64右5位将变成2。
无功iold = 64; / /等于二进制1000000
VaR iold > >新= 5; / /等于10进制的2同样,移动数字会造成空缺。这时间,空间位于左边的数量,但在符号bit.ecmascript填充这些空间与符号位的值来创建一个完整的数,如如图所示:
无符号右移运算
无符号右移运算符比32(大于>大于三)表示,它将把所有数字整数不带符号的数字转换为正数。对于正数,无符号右移运算的结果与符号右移运算相同。
以符号右移操作为例,64右移5位将改为2。
无符号右移操作将所有空格填充为0。对于正数,这与符号右移操作的操作相同,负数被视为正数。
由于无符号右移运算的结果是32位的正数,负数的无符号右移运算总是非常大的。例如,如果将64 - 134217726移到右5位,你将得到1,如果你得到这个结果怎么办
为了实现这一点,我们需要将这个数字转换成一个无符号的等价形式(尽管这个数字本身仍然是签名),我们可以通过以下代码获得这个表单。
无功iunsigned64 = 64 > > > 0;
然后,用数字类型的ToString得到真正位表示(),以2为基数的:代码如下:
警报(iunsigned64.tostring(2));
这将产生11111111111111111111111111 000000的有符号整数64的二进制补码表示,它等于无符号整数4294967232。
为此,使用无符号右移运算符要小心。
现在,负数的算术右移:
我们发现- 9 > 2 = 3,为什么是- 3
首先,符号位是相同的,不是右移,然后在9右移,最低位置是1,然后右移后的最低位置仍然是1!真奇怪。