锁定老帖子 主题:java移位运算符详解
精华帖 (0) :: 良好帖 (16) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-19
无论正数、负数,在计算机中均用补码表示
左移丢弃最高位,低位补零 右移丢弃最低位,高位补符号位 |
|
返回顶楼 | |
发表时间:2010-09-20
左移不用记那么多的规则,可简单理解为:循环左移
|
|
返回顶楼 | |
发表时间:2010-09-20
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。
针对这个问题,有个问题一直没明白,如果是long USER_TAG = 1 << 52; 为什么打印出来的值不是2的52次方,而是2的20次方,既然long型是64位的,不存在溢出这个说法啊,为什么会这样,谁知道原因吗 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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 要如何高效的确定有几个是相同的呢 (以上是胜负彩投注和开奖的一个应用场景) |
|
返回顶楼 | |
发表时间: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; |
|
返回顶楼 | |
发表时间:2010-09-20
挺好的帖子,怎么不可以投良好了呢?
|
|
返回顶楼 | |
发表时间:2010-09-20
真是温故而知新呀,通过LZ的文章又巩固了下知识~
|
|
返回顶楼 | |
发表时间:2010-09-24
位运算的实例比较少,
我贴一个 a = a ^ b; b = b ^ a; a = a ^ b; 无需临时变量,替换两个变量的值. |
|
返回顶楼 | |
发表时间:2010-10-07
不错 把先左移再(循环)右移,或先(循环)右移再左移补上去就更完整啦。 |
|
返回顶楼 | |