[JAVA]移位运算(左移<<,右移>>和无符号右移>>>)
一、背景知识
整数在内存中是以二进制的形式存在的,而且存的是该整数的补码。最高位代表符号位,正数为0,负数为1
正数的补码是其二进制本身,负数的补码则是 符号位保持1不变,其他位按位取反再加1,+0和-0的补码相同,都是0。
负数在进行按位与运算时是以补码形式参与运算。(这个很好理解,因为负数在内存中本身就是以补码存储的)
二、移位运算
下面介绍三种移位运算,
首先我们对5作运算。
5在内存中的存储形式为:0000 0000 0000 0000 0000 0000 0000 0101
1、左移<<
符号位会被保留,数值位左移一位,低位补0,变为:
0000 0000 0000 0000 0000 0000 0000 1010
得到值为10
2、右移>>
符号位会被保留,数值位左移一位,数值位高位补0,变为:
0000 0000 0000 0000 0000 0000 0000 0010
得到值为2
可以看到,左移相当于乘以2,右移相当于除以2,JDK中很多源码都采用了这种写法,效率高而且优雅
3、无符号右移>>>
>>>在右移时会将符号位当做数值位处理,一起右移,高位补0
为了清楚地演示出符号位的变化,以-5为例:
-5在内存中的存储形式为:1111 1111 1111 1111 1111 1111 1111 1011
>>>1 后得到: 0111 1111 1111 1111 1111 1111 1111 1101
值为2147483645,很明显,无论从10进制数值,还是从内存中的存储,都能看出,该值比Integer的最大值小2
代码如下:
/**
* @Description:
* @projectName:JavaTest
* @see:PACKAGE_NAME
* @author:郑晓龙
* @createTime:2019/5/15 23:30
* @version:1.0
*/
public class ShiftOperationTest {
public static void main(String[] args) {
System.out.println(5<<1);
System.out.println(5>>1);
System.out.println(-5>>>1);
System.out.println(Integer.MAX_VALUE);
}
}
运行结果:
10
2
2147483645
2147483647
最后,强迫症来了,为什么没有<<<
我认为是这样的:内存中是将整数以二进制的补码形式存放,最高位是符号位,左移时最高位有可能是1或0,符号位不能确定,也就无法满足无符号左移的定义,而右移可以规定高位补0,即可以确保符号位为0。
[JAVA]移位运算(左移<<,右移>>和无符号右移>>>)的更多相关文章
- Java负整数的左移、右移、无符号右移
转自 Java负整数的左移.右移.无符号右移 Java负整数的左移.右移.无符号右移.正数的位移没有涉及到符号,而且正数的原码.反码.补码都是一样的,所以相对简单,但是对于负整数的位移,往往容易混淆 ...
- 分析轮子(二)- << ,>>,>> (左移、右移、无符号右移)
前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...
- Java,C 位移运算符 有符号右移>>与无符号右移>>>
个人博客 地址:https://www.wenhaofan.com/a/20181029232749 有符号右移 正数有符号右移 首先计算4>>2 将4转为二进制 0000 0100 右移 ...
- java的<<左移,>>右移,>>>无符号右移
>>右移 右移,道在二进制中,假设用一个32位的Int表示一个64,那么高位就都是0,所以当我们把整个二进制数右移,如0100000 >> 2 = 0001000,可以看到右移 ...
- 原码,反码,补码 与(&) 或(|) 非(~) 异或(^) 左移 << 右移 >> 无符号右移 >>>
原码 数字在计算机中以二进制表示,8位的字长,最高位是符号位, 正数为0,负数为1.比如,3为0000 0011: -3为1000 0011. 注意,Java中int为32位.3的16进制表示为3,- ...
- java移位运算符:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规 ...
- java移位运算符实验程序:<<(左移)、>>(带符 号右移)和>>>(无符号右移)
public class txs { static void leftbit(){ int i; //整型长度为32位 ...
- Java 移位运算、符号位扩展
类型取值范围 short 是1字节,即8位.而且 Java 中只有有符号数,所以最大值 0111,1111=2^7-1. 同时计算机中以补码形式存负数,所以可以多表示一个数,则最小值 1000,000 ...
- ABAP语言实现 左移 <<、无符号右移 >>> 位移操作
这几天要在ABAP中实现 3DES 标准对称加密算法,与其他外部系统进行加密/解密操作.由于ABAP语言中没有 左移 <<.无符号右移 >>> 操作,只能自己实现 思路 ...
随机推荐
- Laravel中Homestead添加多站点时遇到问题
Homestead做Laravel的开发还是很方便的,但是在添加多站点的时候,发现几个坑,来做个记录. 首先,官方文档给了修改homestead.yaml文件的方式,只需要在sites字节下添加一个新 ...
- 【php】 jsonp转数组函数jsonp_decode
分享一个可以跟json一样用的函数jsonp_decode,能把jsonp格式数据转为php数组或对象. /** * 把jsonp转为php数组 * @param string $jsonp js ...
- Java学习之IO流及网络编程
一.字节 1.1字节输入流(java.io.InputStream) 此抽象类是表示字节输入流的所有类的超类 1.1.1定义了所有子类共性的方法: int read() 从输入流中读取数据的下 ...
- C#数据结构与算法系列(四):链表——单链表(Single-LinkedList)
1.介绍: 链表是有序的列表,但是它在内存的存储如下: 链表是以节点的方式来存储,链式存储 每一个节点包含data域,next域:指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表 ...
- (三)解决httpclient乱码
原文链接:https://blog.csdn.net/justry_deng/article/details/81042379
- CentOS安装部署Mysql 5.7
1,如果没有安装wget,先安装yum -y install wget 2,下载MySQL官方的 Yum Repositorywget http://repo.mysql.com/mysql57-co ...
- scanf中的%[^\n]%*c格式
scanf中的%[^\n]%*c格式 (2011-02-19 16:12:38) 转载▼ 标签: 控制字符 空白字符 字符串 变量 整数 it 分类: C语言编程 文章转载自http://blog. ...
- springboot + rabbitmq 做智能家居,我也没想到会这么简单
本文收录在个人博客:www.chengxy-nds.top,共享技术资源,共同进步 前一段有幸参与到一个智能家居项目的开发,由于之前都没有过这方面的开发经验,所以对智能硬件的开发模式和技术栈都颇为好奇 ...
- 面试题64:求 1 + 2 + ... + n
这道题目条件限制严格,需要发散思维...但是作者是以 C++ 语言特性来做讲解的,对于 Java 狗只能说稍微有点参考意义吧!
- git常用命令(部分)
git常用命令 1.git init 初始化一个新本地仓库,它在工作目录下生成一个名为.git的隐藏文件夹. 安装好git的,新建一个文件夹,在空文件夹中鼠标右击点击Git Bash Here 2.g ...