移位操作
来源:互联网 发布:淘宝直邮有假货吗 编辑:程序博客网 时间:2024/04/30 03:17
1、左移(>>)
符号位一起参加移位
对于int型,最大的移位数是31,当>=32时,对32取模然后移位;
对于long型,最大的移位数是62,当>=64时,对64取模然后移位;
观察一段代码:
import java.util.*;public class Test{public static void main(String[] args){int i = 0;for(i= -1 ; i != 0 ; i <<= 1){System.out.println("i=" +i+":\t"+ Integer.toBinaryString(i));}System.out.println("i=" +i+":\t"+ Integer.toBinaryString(i));for(i= 1 ; i != 0 ; i <<= 1){System.out.println("i=" +i+":\t"+ Integer.toBinaryString(i));}System.out.println("i=" +i+":\t"+ Integer.toBinaryString(i));}}
i=-1: 11111111111111111111111111111111i=-2: 11111111111111111111111111111110i=-4: 11111111111111111111111111111100i=-8: 11111111111111111111111111111000i=-16: 11111111111111111111111111110000i=-32: 11111111111111111111111111100000i=-64: 11111111111111111111111111000000i=-128: 11111111111111111111111110000000i=-256: 11111111111111111111111100000000i=-512: 11111111111111111111111000000000i=-1024: 11111111111111111111110000000000i=-2048: 11111111111111111111100000000000i=-4096: 11111111111111111111000000000000i=-8192: 11111111111111111110000000000000i=-16384: 11111111111111111100000000000000i=-32768: 11111111111111111000000000000000i=-65536: 11111111111111110000000000000000i=-131072: 11111111111111100000000000000000i=-262144: 11111111111111000000000000000000i=-524288: 11111111111110000000000000000000i=-1048576: 11111111111100000000000000000000i=-2097152: 11111111111000000000000000000000i=-4194304: 11111111110000000000000000000000i=-8388608: 11111111100000000000000000000000i=-16777216: 11111111000000000000000000000000i=-33554432: 11111110000000000000000000000000i=-67108864: 11111100000000000000000000000000i=-134217728: 11111000000000000000000000000000i=-268435456: 11110000000000000000000000000000i=-536870912: 11100000000000000000000000000000i=-1073741824: 11000000000000000000000000000000i=-2147483648: 10000000000000000000000000000000i=0: 0i=1: 1i=2: 10i=4: 100i=8: 1000i=16: 10000i=32: 100000i=64: 1000000i=128: 10000000i=256: 100000000i=512: 1000000000i=1024: 10000000000i=2048: 100000000000i=4096: 1000000000000i=8192: 10000000000000i=16384: 100000000000000i=32768: 1000000000000000i=65536: 10000000000000000i=131072: 100000000000000000i=262144: 1000000000000000000i=524288: 10000000000000000000i=1048576: 100000000000000000000i=2097152: 1000000000000000000000i=4194304: 10000000000000000000000i=8388608: 100000000000000000000000i=16777216: 1000000000000000000000000i=33554432: 10000000000000000000000000i=67108864: 100000000000000000000000000i=134217728: 1000000000000000000000000000i=268435456: 10000000000000000000000000000i=536870912: 100000000000000000000000000000i=1073741824: 1000000000000000000000000000000i=-2147483648: 10000000000000000000000000000000i=0: 02、右移(>>)
符号位不变,其他位移动
<span style="font-size:18px;">import java.util.*;public class Test{public static void main(String[] args){int k=-2147483648;System.out.println("k=" +k+":\t"+ Integer.toBinaryString(k));for(int i= 1 ; i <= 32 ; i ++ ){k >>= 1;System.out.println("k=" +k+":\t"+ Integer.toBinaryString(k));}}}</span>
<span style="font-size:18px;">k=-2147483648: 10000000000000000000000000000000k=-1073741824: 11000000000000000000000000000000k=-536870912: 11100000000000000000000000000000k=-268435456: 11110000000000000000000000000000k=-134217728: 11111000000000000000000000000000k=-67108864: 11111100000000000000000000000000k=-33554432: 11111110000000000000000000000000k=-16777216: 11111111000000000000000000000000k=-8388608: 11111111100000000000000000000000k=-4194304: 11111111110000000000000000000000k=-2097152: 11111111111000000000000000000000k=-1048576: 11111111111100000000000000000000k=-524288: 11111111111110000000000000000000k=-262144: 11111111111111000000000000000000k=-131072: 11111111111111100000000000000000k=-65536: 11111111111111110000000000000000k=-32768: 11111111111111111000000000000000k=-16384: 11111111111111111100000000000000k=-8192: 11111111111111111110000000000000k=-4096: 11111111111111111111000000000000k=-2048: 11111111111111111111100000000000k=-1024: 11111111111111111111110000000000k=-512: 11111111111111111111111000000000k=-256: 11111111111111111111111100000000k=-128: 11111111111111111111111110000000k=-64: 11111111111111111111111111000000k=-32: 11111111111111111111111111100000k=-16: 11111111111111111111111111110000k=-8: 11111111111111111111111111111000k=-4: 11111111111111111111111111111100k=-2: 11111111111111111111111111111110k=-1: 11111111111111111111111111111111k=-1: 11111111111111111111111111111111</span>3、无符号右移(>>>)
高位由0补齐。
<span style="font-size:18px;">import java.util.*;public class Test{public static void main(String[] args){int k=0xFFFFFFFE;System.out.println("k=" +k+":\t"+ Integer.toBinaryString(k));for(int i= 1 ; i <= 64 ; i ++ ){k >>>= 1;System.out.println("k=" +k+":\t"+ Integer.toBinaryString(k));}}}</span>
<span style="font-size:18px;">k=-2: 11111111111111111111111111111110k=2147483647: 1111111111111111111111111111111k=1073741823: 111111111111111111111111111111k=536870911: 11111111111111111111111111111k=268435455: 1111111111111111111111111111k=134217727: 111111111111111111111111111k=67108863: 11111111111111111111111111k=33554431: 1111111111111111111111111k=16777215: 111111111111111111111111k=8388607: 11111111111111111111111k=4194303: 1111111111111111111111k=2097151: 111111111111111111111k=1048575: 11111111111111111111k=524287: 1111111111111111111k=262143: 111111111111111111k=131071: 11111111111111111k=65535: 1111111111111111k=32767: 111111111111111k=16383: 11111111111111k=8191: 1111111111111k=4095: 111111111111k=2047: 11111111111k=1023: 1111111111k=511: 111111111k=255: 11111111k=127: 1111111k=63: 111111k=31: 11111k=15: 1111k=7: 111k=3: 11k=1: 1k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0k=0: 0</span>
谜题:
<span style="font-size:18px;">int i = 0;while(-1<<i != 0){i++;}System.out.println(i);</span>
最后输出什么?实际上是陷入了死循环。
因为在这里-1不可能向左移动32位(左移或右移的最大位数是31或63),所以也就不可能得到0,因此也就不可能推出循环了。
如果想要退出循环,怎么办?
<span style="font-size:18px;">int count = 0;for(int i = -1 ;i != 0 ; i <<= 1){count++;}System.out.println(count);</span>
如此可以打印出32;
0 0
- 移位操作
- 移位操作
- 移位操作
- 移位操作
- 移位操作
- 移位操作
- 移位操作
- 移位操作
- 移位操作
- 移位操作
- 移位操作
- <<移位操作
- 移位操作
- 移位运算,移位操作应用
- 移位操作之旋转移位
- 位操作,移位操作
- Java中的移位操作
- Java中的移位操作
- leetcode 003 —— Longest Substring Without Repeating Characters
- mysql重置密码方法
- Linux系统下通过Socket文件描述符寻找连接状态
- 需求分析常用的UML图
- socket阻塞与非阻塞,同步与异步、I/O模型
- 移位操作
- Ubuntu 10.04 安装在 VMware Workstation 7 后,键盘无法输入的问题的解决方法
- 【ThinkingInJava】8、对象的初始化为null,基本类型默认初始化为0
- xib 自定义视图
- java map的使用与遍历
- Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
- php 解决和避免form表单重复提交的方法
- Android通过Palette来动态决定UI色彩风格
- R语言关于脚本文件的输入和输出