移位运算
java中有三种移位运算符
<< : 左移运算符,0001 << 1,结果是0010
>> : 右移运算符,0010 >> 1,结果是0001
>>> : 无符号右移,忽略符号位,空位都以0补齐
- “>>>”无符号右移位操作符,无论符号是正负,都在高位插入0(都变成了正数)。
-1>>>1得到的结果是2147483647,是integer的最大值。
-1的二进制补码:
1111 1111 1111 1111 1111 1111 1111 1111
右移一位,在最左边空出的一位插入0,变成了32位整数的最大值:
0111 1111 1111 1111 1111 1111 1111 1111
结果是2147483647
- 快速算出移位运算符结果方法:
在不大于自身数值类型最大位数的移位时,一个数移位n,就是将这个数乘以(左移)2的n次幂,右移就是除,然后都取整就可以了
比如int 32位的
500>>3 这样算:500/8 取整 就是62
356>>4 356/16 结果是 22
8<<3 8*8 结果是 64
64位和上面方法一样。
如果移动过大超过了32位怎么办 移位数和32取余得到的数字在套用上面就可以了
比如 500>>67 怎么算?(就相当于500>>3)
1.先67对32取余 结果是3
2. 然后500/8 结果62
- 补充一点:计算机指令种的右移位运算符有2种,左移就是补0没花哨。但右移就有点事情了。
1. 算术右移 意思是你移动后补的是最高位的值。
举例:一个byte数字99 的二进制是 0110 0011
你右移4位后 补的是0 ------0000 0110
但是再看这一个:byte数字-107二进制是1001 0101 这是1开头的
你右移4位后补的确是最高位1 -------1111 1001
2.逻辑右移 补0就完事了
针对右移,C语言美显示给出用哪种的,一般根据编译器/机器组合来确定用哪一种,但大多数都默认算术右移。
JAVA就比较严谨了,明确规定x>>k是算术右移
x>>>k是逻辑右移
话说回来之所以区分这一点我想应该是对有符号的规定吧,无符号右移肯定是逻辑的啊 最高位本来就是0,然而对于负数最高位是1,在进行右移时算术右移的提出解决了一个很普遍的问题,那就是负整数的除法运算,你负数除以一个正数一定是负数吧,如果没有算数右移这一概念的提出不补1都补0的话你得到的就是正数了,算术右移可以替代除法运算。有了这个就完美了,得到的还是负数,符合现实中数学常识了
相关阅读
作者:知乎用户链接:https://www.zhihu.com/question/37601861/answer/145545371来源:知乎著作权归作者所有。商业转载请联系作者获得
OutputStream是java中的抽象类,它是所有表示字节输出流的所有类的超类,输出流介绍字节并将它发送到某个接收器。抽象类OutputStream
Java转义字符 使用场景 //1.路径转义windows路径: D:\ProgramFilesLinux路径: /home/myFilesJava代码中路径符号与Linux一致,而
声明:有人说, 有些面试题很变态,个人认为其实是因为我们基础不扎实或者没有深入。本篇文章来自一位很资深的前辈对于最近java面试题
java中关于try、catch、finally中的细节分析,值得一看,
本文是一个老前辈写的java中的try、catch、finally的用法文章,下面的9个例子,把涵盖的所有用法基本都涵盖了,值得大家细细的观看,很有