2.1(java编程思想笔记)位移操作
java位移操作主要有两种:
有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数。
有符号位左移时,低位补0。
有符号右移时:当数字为正数,高位补0。当数字为负时高位补1.
无符号位移:无符号位移不能保持原有正负性,与有符号位移的主要差异主要体现在右移时,
无论数字是正数还是负数,高位统一补0.(无符号左移低位依然是补0)
java编程思想里面有这样一句话:当int型数据位移时,只有数值右端的低5位才有用,long型数值只会用到数值右端的低6位。
这里的数值指的是右操作数,即需要位移的位数,即将位移的位数转换为二进制,然后取后五位,这五位所代表的数值才是实际位移的数。
这是因为int型数据一共有32位,而取右操作数的后五位(后五位最大表示31(1 1111),即最多移动31位)可以防止其位移出界。
同样long型数据是64位,所指只考虑后六位,即最多移动63(11 1111)位。
位移符号后面可以加“=”号,就类似s>>=2就相当于 s = s>>2;将原有数更新为位移后的数。
举个例子:
例如 int i = 8; i>>33; i(0000 0000 0000 0000 0000 0000 0000 0000 0000 1000)
位移时只考虑33对应二进制的后五位( 0010 0001),即只会位移(0 0001)一位。
可以看做int i = 8>>(位移数%32)。 如果是long型数据就是位移33位,long的 实际位移数=位移数%64。

例如int类型的3(011)实际只位移了一位变成了(110)。
对于short、byte使用位移时需要注意,因为short、byte在进行位移操作是会先转换为int,然后进行位移。
最后将位移结果进行截取。
我们先看一个例子:
public class Test {
public static void main(String[] args) {
byte b = -1;
short s = -1;
int i = -1;
System.out.println("byte:\t" + Integer.toBinaryString(b));
System.out.println("short:\t" + Integer.toBinaryString(b));
System.out.println("int:\t" + Integer.toBinaryString(b));
b>>>=2;//(byte,short会先转换为int)先转换为int,然后位移,最后截取对应位数,然后将截取后的值赋给自身。
s>>>=2;
i>>>=2;
System.out.println("byte:\t" + b);
System.out.println("short:\t" + s);
System.out.println("byte:\t" + Integer.toBinaryString(b));
System.out.println("short:\t" + Integer.toBinaryString(s));
}
}
运行结果:
byte: 11111111111111111111111111111111
short: 11111111111111111111111111111111
byte: -1
short: -1
byte: 11111111111111111111111111111111
short: 11111111111111111111111111111111
可以发现short、byte为-1时采用无符号位移,结果没有改变。
我们来分析下执行过程:
首先short通过Integer.toBinaryString(int i)方法转换为int显示,所以显示的是32个1.(负数采用补码存储,可百度补码规则)
然后对s进行位移,s(16个1)会先转换为int型,就是32个1,然后进行无符号右移两位结果为(0011 1111 1111 1111 1111 1111 1111 1111)
由于short占16位,所以截取后16位赋给s。即s(1111 1111 1111 1111),此时s依然为-1.
当位移数超过16时,s才会有变化。
参考资料:
《java编程思想》
https://segmentfault.com/q/1010000000414831
https://blog.csdn.net/showershow/article/details/6959122
2.1(java编程思想笔记)位移操作的更多相关文章
- java编程思想笔记(1)
java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...
- Java编程思想 笔记
date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...
- #Java编程思想笔记(一)——static
Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...
- 7.JAVA编程思想笔记隐藏实施过程
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040237 "进行面向对象的设计时,一项主要的考虑是:怎样将发生变 ...
- java编程思想笔记(一)——面向对象导论
1.1 抽象过程 1.所有编程语言都提供抽象编程机制. 2.人们所能够解决的问题的复杂性直接取决于抽象的类型(所抽象的是什么)和质量. 3."命令式"语言(basic,c等)都是对 ...
- Java编程思想笔记(第二章)
第二章 一切都是对象 尽管Java是基于C++的,但相比之下,Java是一种更纯粹的面向对象程序设计语言. c++和Java都是杂合型语言(hybird language) 用引用(referenc ...
- java编程思想笔记(第一章)
Alan Kay 第一个定义了面向对象的语言 1.万物皆对象 2.程序是对象的集合,他们彼此通过发送消息来调用对方. 3.每个对象都拥有由其他对象所构成的存储 4.每个对象都拥有其类型(TYpe) 5 ...
- 【Java编程思想笔记】反射
文章参考:学习网站 how2java.cn 参考博客:(敬业的小码哥)https://blog.csdn.net/sinat_38259539/article/details/71799078 (青色 ...
- 【Java编程思想笔记】-集合2
详细的接口API转自博客:https://blog.csdn.net/jyg0723/article/details/80498840#collection-api-%E8%AF%A6%E8%A7%A ...
随机推荐
- Android控件——ToggleButton多状态按钮(实现灯泡的开关)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxoAAAFxCAIAAAB7jkm1AAAgAElEQVR4nOy9eXgUVb7/Dy7j3BnH8T
- nginx 伪静态rewrite
location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所 ...
- SD 模拟sip 读写子程序
void simulate_spi_write_byte(u8 data){ u8 kk; SPI3_CS(0); SPI3_SCK(0); delay_us(1); //???spi???1/2us ...
- Open Compute Project
Open Compute Project https://github.com/opencomputeproject https://github.com/floodlight/floodlight ...
- Hadoop-MR[会用]MR程序的运行模式
1.简介 现在很少用到使用MR计算框架来实现功能,通常的做法是使用hive等工具辅助完成.但是对于其底层MR的原理还是有必要做一些了解. 2.MR客户端程序实现套路 这一小节总结归纳编写mr客户端程序 ...
- Centos7 安装
一.先把Centos7的镜像下载到本地 镜像下载网址:http://archive.kernel.org/centos-vault/ (里面有任何需要的版本) 二.启动VMware 1. 创建新的虚拟 ...
- NFS+inotify实时同步
Inotify简介 Inotify是一种文件系统事件通告机制,能够实时监控文件系统下文件的访问.修改.删除等各种变化情况并将其作为事件通告给用户态应用程序.Linux内核从2.6.13版本后已经集成了 ...
- Linux命令--more
more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...
- java - 线程1打印1-10,当线程打印到5后,线程2打印“hello”,然后线程1继续打印
public class T { private static int a =1;//1代表线程1 2线程2 public static void main(String[] args) { fina ...
- 看懂sh脚本
1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编写脚本完成时 ...