论坛首页 Java企业应用论坛

java移位运算符详解

浏览 23177 次
精华帖 (0) :: 良好帖 (16) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-09-19  
无论正数、负数,在计算机中均用补码表示
左移丢弃最高位,低位补零
右移丢弃最低位,高位补符号位
0 请登录后投票
   发表时间:2010-09-20  
左移不用记那么多的规则,可简单理解为:循环左移
0 请登录后投票
   发表时间:2010-09-20  
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。
针对这个问题,有个问题一直没明白,如果是long USER_TAG = 1 << 52;
为什么打印出来的值不是2的52次方,而是2的20次方,既然long型是64位的,不存在溢出这个说法啊,为什么会这样,谁知道原因吗
0 请登录后投票
   发表时间:2010-09-20  
10<<num 相当于num个2相乘然后再乘以10
如: 10<<3 == (2*2*2)*10
10>>num 相当于10除以num个2相乘,如果第一个数是负数,则在结果前加负号
如: 10>>2==10/(2*2)==2
0 请登录后投票
   发表时间:2010-09-20   最后修改:2010-09-20
yuzhongqing 写道
这东西平时用的很少。


应用的地方还是很多的
效益方面也确实高了很多


一组字符 1,0,3,1,3,31,31,3,1,0,0,0,3,3
一组校准字符 1,0,0,1,1,3,0,1,0,1,0,3,1,3
要如何高效的确定有几个是相同的呢
(以上是胜负彩投注和开奖的一个应用场景)
0 请登录后投票
   发表时间:2010-09-20  
bbym010 写道
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。
针对这个问题,有个问题一直没明白,如果是long USER_TAG = 1 << 52;
为什么打印出来的值不是2的52次方,而是2的20次方,既然long型是64位的,不存在溢出这个说法啊,为什么会这样,谁知道原因吗


USER_TAG是long型的,但在你这里 1 却是int型的。

所以正确的写法是
long USER_TAG = 1L << 52;


0 请登录后投票
   发表时间:2010-09-20  
挺好的帖子,怎么不可以投良好了呢?
0 请登录后投票
   发表时间:2010-09-20  
真是温故而知新呀,通过LZ的文章又巩固了下知识~
0 请登录后投票
   发表时间:2010-09-24  
位运算的实例比较少,
   我贴一个
   a = a ^ b;
   b = b ^ a;
   a = a ^ b;
无需临时变量,替换两个变量的值.
0 请登录后投票
   发表时间:2010-10-07  

不错

把先左移再(循环)右移,或先(循环)右移再左移补上去就更完整啦。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics