java,javaScript 二进制位运算符--底层原理

8 篇文章 1 订阅
6 篇文章 0 订阅

  javaScript的二进制位运算符包括以下几种:

  • 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1
  • 二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。
  • 二进制否运算符(not):符号为~,表示对一个二进制位取反。
  • 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。
  • 左移运算符(left shift):符号为<<
  • 右移运算符(right shift):符号为>>
  • 带符号位的右移运算符(zero filled right shift):符号为>>>

   我们以异或运算符^作为列子,来重点讲解其底层原理; 请先看下面的列子:

var a = 10;
var b = 99;

a ^= b, b ^= a, a ^= b;

a // 99
b // 10

a与b的值神奇般的交换了位置。why? 这是为什么呢? 肯定有不少同学会茫茫不知其理吧! 这时候有人提出了一种思维:

var a = 1;
var b = 2;

a = a + b; //a = 3
b = a - b; //b = 1
a = a - b; //a = 2

        通过以上的逻辑思维确实也让a,b的值互换了位置,而且思维与a ^= b, b ^= a, a ^= b 的过程极为相似,但是这压根就不是一回事。

       为什么这么说呢?听我细细道来:

       异或运算符既然采取的是二进制运算,那么自然计算与转换的都是二进制。 所以当运算a ^= b, b ^= a, a ^= b时,javaScript会先将相应的数值转换成二进制的表达式,a = 10 即 a = 1010(二进制);b = 99即b = 1100011(二进制);所以a ^= b真正运算的过程是a ^= b  >>>  a = a ^b  >>> a = 1010^1100011。

       那么根据运算法则: 异或运算符表示若两个二进制位不相同,则结果为1,否则为0。根据此规则我们就可以算出新的二进制数了。这时候又会有同学疑惑了1010和1100011他们的位数都不同,如何比较他们的二进制位呢? 其实在计算机中,Java中的int在内存中占有4个字节,一个字节占8位数;而JavaScript 语言的底层根本没有整数,所有数字都是小数(64位浮点数)。容易造成混淆的是,某些运算只有整数才能完成,此时 JavaScript 会自动把64位浮点数,转成32位整数,然后再进行运算。

        所以,10的二进制在内存中真正的表达式是:00000000 00000000 00000000 00001010;而99的二进制在内存中真正表达的是: 00000000 00000000 01100011。在一般运算或书写时只是省略了前面的0而已。所以a ^b真正表达的是:

00000000 00000000 00000000 00001010 ^
00000000 00000000 00000000 01100011

然后根据规则,位数与位数相同则返回0,不同则返回1。那么前面的25个0也都返回0,也就可以直接省略了。那么a ^= b运算的结果如下:

a ^= b;
a = a ^ b;
a = (
    0001010 ^ 
    1100011
    );
a = 1101001; //a = 105

接下来运算 b ^= a,同理运算结果如下:

b ^= a;
b = b ^ a;
b = (
    1100011 ^ 
    1101001
    );
b = 0001010 ; //b = 10

第二步就成功的将a的初始值10赋值给b了,最后一步 a ^= b,又重复运算了,但此时a,b的值都发生了变化,这时候a = 105,b = 10;运算结果如下:

a ^= b;
a = a ^ b;
b = (
    1101001^ 
    0001010 
    );
a = 1100011 ; //a = 99

       如此一来,又成功把b的原始值99赋值给了a。看起来是不是很有意思啊。一开始 10 ^ 99 = 105;而后又 105 ^ 10 = 99;这类似于“取反”,也如同加减乘除法,所以一开始我说逻辑很类似于a = a + b; b = a - b;   a = a - b。只是他们执行的底层原理不同而已。而且异或运算是直接操作底层二进制的,所以速度最快,性能最优,这是互换两个变量值最快的方式。

       其实java的二进制转换也是这个原理!所以这里就不多罗说了。

       好了,今天就写到这里了;大家如果对这个还有什么疑问,可以联系我。

       亲爱的同学们,如果您觉得我的文章写的好,对你有所帮助,请关注我的微信公众平台《深圳参考》。谢谢!

                                                                                     -- 作者: 龚文学。2018年9月18日.

                                                                                      --  QQ:  444579384.

                                                                                      -- 邮箱:  gongWenXue@foxmail.com.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值